diff options
author | Gaius Mulley <gaiusmod2@gmail.com> | 2024-01-19 17:16:38 +0000 |
---|---|---|
committer | Gaius Mulley <gaiusmod2@gmail.com> | 2024-01-19 17:16:38 +0000 |
commit | e04376b336502016456eaf4e90c3ea792c77c8df (patch) | |
tree | 8a8e5d875bcd4be3eda5a28d39b83f67ae0a93ec /gcc | |
parent | 81417a42470cc6e448370341a2fc8a17a7c52c85 (diff) | |
download | gcc-e04376b336502016456eaf4e90c3ea792c77c8df.zip gcc-e04376b336502016456eaf4e90c3ea792c77c8df.tar.gz gcc-e04376b336502016456eaf4e90c3ea792c77c8df.tar.bz2 |
modula2: tidyup gcc/m2/gm2-compiler/M2GenGCC.mod remove unused parameters/vars
This patch removes unused parameters and local variables from
M2GenGCC.mod. It required ForeachScopeBlockDo2 to be implemented and
exported affecting any module indirectly calling ConvertQuadsToTree.
gcc/m2/ChangeLog:
* gm2-compiler/M2BasicBlock.mod (InitBasicBlocks): Rename
ForeachScopeBlockDo to ForeachScopeBlockDo3.
* gm2-compiler/M2Code.mod: Import ForeachScopeBlockDo2.
(OptimizeScopeBlock): Call ForeachScopeBlockDo3 for
procedures with three parameters and ForeachScopeBlockDo2
for two parameters.
(CodeBlock): Ditto.
* gm2-compiler/M2GCCDeclare.mod (DeclareTypesConstantsProcedures):
Rename ForeachScopeBlockDo to ForeachScopeBlockDo3.
* gm2-compiler/M2GenGCC.def (ConvertQuadsToTree): Remove Scope
parameter.
* gm2-compiler/M2GenGCC.mod (ConvertQuadsToTree): Remove Scope
parameter.
(MaybeDebugBuiltinMemcpy): Remove parameter tok.
(MaybeDebugBuiltinMemset): Remove.
(MakeCopyUse): Remove tokenno from call to
MaybeDebugBuiltinMemcpy.
(PerformFoldBecomes): Remove desloc and exprloc.
(checkArrayElements): Remove location. Remove virtpos
as a parameter to MaybeDebugBuiltinMemcpy.
(NoWalkProcedure): Add attribute unused.
(CheckElementSetTypes): Remove parameter p.
Remove CurrentQuadToken in call to MaybeDebugBuiltinMemcpy.
Remove NoWalkProcedure from call to CheckElementSetTypes.
Remove tokenno from call to MaybeDebugBuiltinMemcpy.
* gm2-compiler/M2Optimize.mod (RemoveProcedures): Replace
two parameter indirect procedure iterator with
ForeachScopeBlockDo2.
* gm2-compiler/M2SSA.mod: Remove ForeachScopeBlockDo.
* gm2-compiler/M2Scope.def (ForeachScopeBlockDo2): New
declaration.
(ForeachScopeBlockDo): Rename ...
(ForeachScopeBlockDo3): ... to this.
(ScopeProcedure2): New declaration.
* gm2-compiler/M2Scope.mod (ForeachScopeBlockDo2): New
procedure.
(ForeachScopeBlockDo): Rename ...
(ForeachScopeBlockDo3): ... to this.
Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/m2/gm2-compiler/M2BasicBlock.mod | 5 | ||||
-rw-r--r-- | gcc/m2/gm2-compiler/M2Code.mod | 24 | ||||
-rw-r--r-- | gcc/m2/gm2-compiler/M2GCCDeclare.mod | 4 | ||||
-rw-r--r-- | gcc/m2/gm2-compiler/M2GenGCC.def | 2 | ||||
-rw-r--r-- | gcc/m2/gm2-compiler/M2GenGCC.mod | 64 | ||||
-rw-r--r-- | gcc/m2/gm2-compiler/M2Optimize.mod | 12 | ||||
-rw-r--r-- | gcc/m2/gm2-compiler/M2SSA.mod | 2 | ||||
-rw-r--r-- | gcc/m2/gm2-compiler/M2Scope.def | 21 | ||||
-rw-r--r-- | gcc/m2/gm2-compiler/M2Scope.mod | 40 |
9 files changed, 97 insertions, 77 deletions
diff --git a/gcc/m2/gm2-compiler/M2BasicBlock.mod b/gcc/m2/gm2-compiler/M2BasicBlock.mod index 007fe77..f4b9cb0 100644 --- a/gcc/m2/gm2-compiler/M2BasicBlock.mod +++ b/gcc/m2/gm2-compiler/M2BasicBlock.mod @@ -37,8 +37,7 @@ FROM M2Quads IMPORT IsReferenced, IsConditional, IsUnConditional, IsCall, GetNextQuad, GetQuad, QuadOperator, SubQuad, DisplayQuadRange ; -FROM M2Scope IMPORT ScopeBlock, ForeachScopeBlockDo ; -FROM M2GenGCC IMPORT ConvertQuadsToTree ; +FROM M2Scope IMPORT ScopeBlock, ForeachScopeBlockDo3 ; CONST @@ -68,7 +67,7 @@ VAR PROCEDURE InitBasicBlocks (sb: ScopeBlock) : BasicBlock ; BEGIN HeadOfBasicBlock := NIL ; - ForeachScopeBlockDo (sb, ConvertQuads2BasicBlock) ; + ForeachScopeBlockDo3 (sb, ConvertQuads2BasicBlock) ; RETURN HeadOfBasicBlock END InitBasicBlocks ; diff --git a/gcc/m2/gm2-compiler/M2Code.mod b/gcc/m2/gm2-compiler/M2Code.mod index 1c7ff83..010e1d0 100644 --- a/gcc/m2/gm2-compiler/M2Code.mod +++ b/gcc/m2/gm2-compiler/M2Code.mod @@ -61,7 +61,9 @@ FROM M2GCCDeclare IMPORT FoldConstants, StartDeclareScope, DeclareProcedure, InitDeclarations, DeclareModuleVariables, MarkExported ; -FROM M2Scope IMPORT ScopeBlock, InitScopeBlock, KillScopeBlock, ForeachScopeBlockDo ; +FROM M2Scope IMPORT ScopeBlock, InitScopeBlock, KillScopeBlock, + ForeachScopeBlockDo2, ForeachScopeBlockDo3 ; + FROM m2top IMPORT StartGlobalContext, EndGlobalContext, SetFlagUnitAtATime ; FROM M2Error IMPORT FlushErrors, FlushWarnings ; FROM M2Swig IMPORT GenerateSwigFile ; @@ -402,15 +404,15 @@ BEGIN InitOptimizeVariables ; OptimTimes := 1 ; Current := CountQuads () ; - ForeachScopeBlockDo (sb, InitialDeclareAndOptimize) ; - ForeachScopeBlockDo (sb, ScopeBlockVariableAnalysis) ; + ForeachScopeBlockDo3 (sb, InitialDeclareAndOptimize) ; + ForeachScopeBlockDo3 (sb, ScopeBlockVariableAnalysis) ; REPEAT - ForeachScopeBlockDo (sb, SecondDeclareAndOptimize) ; + ForeachScopeBlockDo3 (sb, SecondDeclareAndOptimize) ; Previous := Current ; Current := CountQuads () ; INC (OptimTimes) UNTIL (OptimTimes=MaxOptimTimes) OR (Current=Previous) ; - ForeachScopeBlockDo (sb, LoopAnalysis) + ForeachScopeBlockDo3 (sb, LoopAnalysis) END OptimizeScopeBlock ; @@ -476,30 +478,30 @@ BEGIN THEN n := GetSymName(scope) ; printf1('before coding procedure %a\n', n) ; - ForeachScopeBlockDo(sb, DisplayQuadRange) ; + ForeachScopeBlockDo3 (sb, DisplayQuadRange) ; printf0('===============\n') END ; - ForeachScopeBlockDo(sb, ConvertQuadsToTree) + ForeachScopeBlockDo2 (sb, ConvertQuadsToTree) ELSIF IsModuleWithinProcedure(scope) THEN IF DisplayQuadruples THEN n := GetSymName(scope) ; printf1('before coding module %a within procedure\n', n) ; - ForeachScopeBlockDo(sb, DisplayQuadRange) ; + ForeachScopeBlockDo3 (sb, DisplayQuadRange) ; printf0('===============\n') END ; - ForeachScopeBlockDo(sb, ConvertQuadsToTree) ; + ForeachScopeBlockDo2 (sb, ConvertQuadsToTree) ; ForeachProcedureDo(scope, CodeBlock) ELSE IF DisplayQuadruples THEN n := GetSymName(scope) ; printf1('before coding module %a\n', n) ; - ForeachScopeBlockDo(sb, DisplayQuadRange) ; + ForeachScopeBlockDo3 (sb, DisplayQuadRange) ; printf0('===============\n') END ; - ForeachScopeBlockDo(sb, ConvertQuadsToTree) ; + ForeachScopeBlockDo2 (sb, ConvertQuadsToTree) ; IF WholeProgram THEN ForeachSourceModuleDo(CodeProcedures) diff --git a/gcc/m2/gm2-compiler/M2GCCDeclare.mod b/gcc/m2/gm2-compiler/M2GCCDeclare.mod index 594178f..643374d 100644 --- a/gcc/m2/gm2-compiler/M2GCCDeclare.mod +++ b/gcc/m2/gm2-compiler/M2GCCDeclare.mod @@ -144,7 +144,7 @@ FROM M2System IMPORT IsPseudoSystemFunction, IsSystemType, FROM M2Bitset IMPORT Bitset, Bitnum ; FROM SymbolConversion IMPORT AddModGcc, Mod2Gcc, GccKnowsAbout, Poison, RemoveMod2Gcc ; FROM M2GenGCC IMPORT ResolveConstantExpressions ; -FROM M2Scope IMPORT ScopeBlock, InitScopeBlock, KillScopeBlock, ForeachScopeBlockDo ; +FROM M2Scope IMPORT ScopeBlock, InitScopeBlock, KillScopeBlock, ForeachScopeBlockDo3 ; FROM M2ALU IMPORT Addn, Sub, Equ, GreEqu, Gre, Less, PushInt, PushCard, ConvertToType, PushIntegerTree, PopIntegerTree, PopRealTree, ConvertToInt, PopSetTree, @@ -2865,7 +2865,7 @@ BEGIN PushBinding (scope) ; REPEAT copy := DupGroup (copy) ; - ForeachScopeBlockDo (sb, DeclareTypesConstantsProceduresInRange) + ForeachScopeBlockDo3 (sb, DeclareTypesConstantsProceduresInRange) UNTIL EqualGroup (copy, GlobalGroup) ; KillGroup (copy) ; PopBinding (scope) ; diff --git a/gcc/m2/gm2-compiler/M2GenGCC.def b/gcc/m2/gm2-compiler/M2GenGCC.def index bb755a3f..3e4705e 100644 --- a/gcc/m2/gm2-compiler/M2GenGCC.def +++ b/gcc/m2/gm2-compiler/M2GenGCC.def @@ -45,7 +45,7 @@ EXPORT QUALIFIED ConvertQuadsToTree, ResolveConstantExpressions, the GCC tree structure. *) -PROCEDURE ConvertQuadsToTree (Scope: CARDINAL; Start, End: CARDINAL) ; +PROCEDURE ConvertQuadsToTree (Start, End: CARDINAL) ; (* diff --git a/gcc/m2/gm2-compiler/M2GenGCC.mod b/gcc/m2/gm2-compiler/M2GenGCC.mod index 2261cb0..ced4724 100644 --- a/gcc/m2/gm2-compiler/M2GenGCC.mod +++ b/gcc/m2/gm2-compiler/M2GenGCC.mod @@ -415,7 +415,7 @@ END IsExportedGcc ; the GCC tree structure. *) -PROCEDURE ConvertQuadsToTree (Scope: CARDINAL; Start, End: CARDINAL) ; +PROCEDURE ConvertQuadsToTree (Start, End: CARDINAL) ; BEGIN REPEAT CodeStatement (Start) ; @@ -1311,7 +1311,9 @@ END GetSizeOfHighFromUnbounded ; (* - MaybeDebugBuiltinAlloca - + MaybeDebugBuiltinAlloca - if DebugBuiltins is set + then call Builtins.alloca_trace + else call Builtins.alloca. *) PROCEDURE MaybeDebugBuiltinAlloca (location: location_t; tok: CARDINAL; high: Tree) : Tree ; @@ -1339,10 +1341,12 @@ END MaybeDebugBuiltinAlloca ; (* - MaybeDebugBuiltinMemcpy - + MaybeDebugBuiltinMemcpy - if DebugBuiltins is set + then call memcpy + else call Builtins.memcpy. *) -PROCEDURE MaybeDebugBuiltinMemcpy (location: location_t; tok: CARDINAL; src, dest, nbytes: Tree) : Tree ; +PROCEDURE MaybeDebugBuiltinMemcpy (location: location_t; src, dest, nbytes: Tree) : Tree ; VAR call, func: Tree ; @@ -1360,28 +1364,6 @@ END MaybeDebugBuiltinMemcpy ; (* - MaybeDebugBuiltinMemset - -*) - -PROCEDURE MaybeDebugBuiltinMemset (location: location_t; tok: CARDINAL; - ptr, bytevalue, nbytes: Tree) : Tree ; -VAR - call, - func: Tree ; -BEGIN - IF DebugBuiltins - THEN - func := Mod2Gcc (Memset) ; - call := BuildCall3 (location, func, GetPointerType (), ptr, bytevalue, nbytes) ; - ELSE - call := BuiltinMemSet (location, ptr, bytevalue, nbytes) - END ; - SetLastFunction (call) ; - RETURN BuildFunctValue (location, call) -END MaybeDebugBuiltinMemset ; - - -(* MakeCopyUse - make a copy of the unbounded array and alter all references from the old unbounded array to the new unbounded array. The parameter, param, contains a RECORD @@ -1411,7 +1393,7 @@ BEGIN Addr := GetAddressOfUnbounded (location, param) ; NewArray := MaybeDebugBuiltinAlloca (location, tokenno, High) ; - NewArray := MaybeDebugBuiltinMemcpy (location, tokenno, NewArray, Addr, High) ; + NewArray := MaybeDebugBuiltinMemcpy (location, NewArray, Addr, High) ; (* now assign param.Addr := ADR(NewArray) *) @@ -2784,7 +2766,6 @@ VAR exprpos, becomespos, virtpos : CARDINAL ; op : QuadOperator ; - desloc, exprloc : location_t ; BEGIN GetQuadOtok (quad, becomespos, op, des, op2, expr, overflowChecking, @@ -3106,9 +3087,8 @@ END PrepareCopyString ; PROCEDURE checkArrayElements (des, expr: CARDINAL; virtpos, despos, exprpos: CARDINAL) : BOOLEAN ; VAR - e1, e3 : Tree ; - t1, t3 : CARDINAL ; - location: location_t ; + e1, e3: Tree ; + t1, t3: CARDINAL ; BEGIN t1 := GetType (des) ; t3 := GetType (expr) ; @@ -3304,7 +3284,7 @@ BEGIN expr, des) END ; AddStatement (location, - MaybeDebugBuiltinMemcpy (location, virtpos, + MaybeDebugBuiltinMemcpy (location, BuildAddr (location, Mod2Gcc (des), FALSE), BuildAddr (location, exprt, FALSE), length)) @@ -3319,7 +3299,7 @@ BEGIN THEN checkDeclare (des) ; AddStatement (location, - MaybeDebugBuiltinMemcpy (location, virtpos, + MaybeDebugBuiltinMemcpy (location, BuildAddr(location, Mod2Gcc (des), FALSE), BuildAddr(location, Mod2Gcc (expr), FALSE), BuildSize(location, Mod2Gcc (des), FALSE))) @@ -3624,7 +3604,7 @@ END CodeBinary ; NoWalkProcedure - *) -PROCEDURE NoWalkProcedure (param: CARDINAL) ; +PROCEDURE NoWalkProcedure (param: CARDINAL <* unused *>) ; BEGIN END NoWalkProcedure ; @@ -3688,12 +3668,12 @@ END CheckBinaryExpressionTypes ; (* CheckElementSetTypes - returns TRUE if all expression checks pass. - If the expression check fails quad is removed, - the walk procedure (des) is called and NoChange is - set to FALSE. + If the expression check fails quad is removed, + the walk procedure (des) is called and NoChange is + set to FALSE. *) -PROCEDURE CheckElementSetTypes (quad: CARDINAL; p: WalkAction) : BOOLEAN ; +PROCEDURE CheckElementSetTypes (quad: CARDINAL) : BOOLEAN ; VAR lefttype, righttype, @@ -6472,7 +6452,7 @@ BEGIN (* does not work t := BuildCoerce(Mod2Gcc(op1), Mod2Gcc(op2), Mod2Gcc(op3)) *) checkDeclare (op1) ; AddStatement (location, - MaybeDebugBuiltinMemcpy(location, CurrentQuadToken, + MaybeDebugBuiltinMemcpy(location, BuildAddr(location, Mod2Gcc(op1), FALSE), BuildAddr(location, Mod2Gcc(op3), FALSE), FindSize(CurrentQuadToken, op2))) @@ -7371,7 +7351,7 @@ BEGIN IF IsConst(op1) AND IsConst(op2) THEN InternalError ('should not get to here (if we do we should consider calling FoldIfIn)') - ELSIF CheckElementSetTypes (quad, NoWalkProcedure) + ELSIF CheckElementSetTypes (quad) THEN IF IsConst(op1) THEN @@ -7438,7 +7418,7 @@ BEGIN IF IsConst(op1) AND IsConst(op2) THEN InternalError ('should not get to here (if we do we should consider calling FoldIfIn)') - ELSIF CheckElementSetTypes (quad, NoWalkProcedure) + ELSIF CheckElementSetTypes (quad) THEN IF IsConst(op1) THEN @@ -7576,7 +7556,7 @@ BEGIN op3, op1) END ; AddStatement (location, - MaybeDebugBuiltinMemcpy (location, tokenno, + MaybeDebugBuiltinMemcpy (location, Mod2Gcc (op1), BuildAddr (location, newstr, FALSE), length)) diff --git a/gcc/m2/gm2-compiler/M2Optimize.mod b/gcc/m2/gm2-compiler/M2Optimize.mod index 1a653c0..29fda9a 100644 --- a/gcc/m2/gm2-compiler/M2Optimize.mod +++ b/gcc/m2/gm2-compiler/M2Optimize.mod @@ -38,7 +38,8 @@ FROM NumberIO IMPORT WriteCard ; FROM M2Error IMPORT InternalError ; FROM M2Batch IMPORT GetModuleNo ; FROM M2Quiet IMPORT qprintf1 ; -FROM M2Scope IMPORT ScopeBlock, InitScopeBlock, KillScopeBlock, ForeachScopeBlockDo ; +FROM M2Scope IMPORT ScopeBlock, InitScopeBlock, KillScopeBlock, + ForeachScopeBlockDo2, ForeachScopeBlockDo3 ; FROM SymbolTable IMPORT GetSymName, GetProcedureQuads, GetModuleQuads, @@ -336,13 +337,13 @@ BEGIN IF IsProcedure(scope) THEN PutProcedureReachable(scope) ; - ForeachScopeBlockDo(sb, KnownReachable) + ForeachScopeBlockDo2 (sb, KnownReachable) ELSIF IsModuleWithinProcedure(scope) THEN - ForeachScopeBlockDo(sb, KnownReachable) ; + ForeachScopeBlockDo2 (sb, KnownReachable) ; ForeachProcedureDo(scope, CheckExportedReachable) ELSE - ForeachScopeBlockDo(sb, KnownReachable) ; + ForeachScopeBlockDo2 (sb, KnownReachable) ; ForeachProcedureDo(scope, CheckExportedReachable) END ; ForeachInnerModuleDo(scope, RemoveProcedures) ; @@ -351,8 +352,7 @@ BEGIN END RemoveProcedures ; -PROCEDURE KnownReachable (Scope: CARDINAL; - Start, End: CARDINAL) ; +PROCEDURE KnownReachable (Start, End: CARDINAL) ; VAR Op : QuadOperator ; Op1, Op2, Op3: CARDINAL ; diff --git a/gcc/m2/gm2-compiler/M2SSA.mod b/gcc/m2/gm2-compiler/M2SSA.mod index c984c62..e59428c 100644 --- a/gcc/m2/gm2-compiler/M2SSA.mod +++ b/gcc/m2/gm2-compiler/M2SSA.mod @@ -31,7 +31,7 @@ FROM NumberIO IMPORT WriteCard ; FROM M2Error IMPORT InternalError ; FROM M2Batch IMPORT GetModuleNo ; FROM M2Quiet IMPORT qprintf1 ; -FROM M2Scope IMPORT ScopeBlock, InitScopeBlock, KillScopeBlock, ForeachScopeBlockDo ; +FROM M2Scope IMPORT ScopeBlock, InitScopeBlock, KillScopeBlock ; FROM M2StackWord IMPORT StackOfWord, InitStackWord, KillStackWord, PushWord, PopWord, PeepWord ; FROM M2Options IMPORT CompilerDebugging ; FROM Lists IMPORT InitList, KillList, List, IncludeItemIntoList, IsItemInList ; diff --git a/gcc/m2/gm2-compiler/M2Scope.def b/gcc/m2/gm2-compiler/M2Scope.def index bdb063d..917229f 100644 --- a/gcc/m2/gm2-compiler/M2Scope.def +++ b/gcc/m2/gm2-compiler/M2Scope.def @@ -31,13 +31,10 @@ DEFINITION MODULE M2Scope ; which were generated within a scope. *) -EXPORT QUALIFIED ScopeBlock, ScopeProcedure, - InitScopeBlock, KillScopeBlock, - ForeachScopeBlockDo ; - TYPE ScopeBlock ; - ScopeProcedure = PROCEDURE (CARDINAL, CARDINAL, CARDINAL) ; + ScopeProcedure2 = PROCEDURE (CARDINAL, CARDINAL) ; + ScopeProcedure3 = PROCEDURE (CARDINAL, CARDINAL, CARDINAL) ; (* @@ -55,11 +52,19 @@ PROCEDURE KillScopeBlock (VAR sb: ScopeBlock) ; (* - ForeachScopeBlockDo - calls a procedure, p, for each block of contigeous quadruples - defining an outer scope, sb. + ForeachScopeBlockDo2 - calls a procedure p for each block of contigeous quadruples + defining an outer scope sb. +*) + +PROCEDURE ForeachScopeBlockDo2 (sb: ScopeBlock; p: ScopeProcedure2) ; + + +(* + ForeachScopeBlockDo3 - calls a procedure p for each block of contigeous quadruples + defining an outer scope sb. *) -PROCEDURE ForeachScopeBlockDo (sb: ScopeBlock; p: ScopeProcedure) ; +PROCEDURE ForeachScopeBlockDo3 (sb: ScopeBlock; p: ScopeProcedure3) ; END M2Scope. diff --git a/gcc/m2/gm2-compiler/M2Scope.mod b/gcc/m2/gm2-compiler/M2Scope.mod index 570bb04..f157ad4 100644 --- a/gcc/m2/gm2-compiler/M2Scope.mod +++ b/gcc/m2/gm2-compiler/M2Scope.mod @@ -410,10 +410,44 @@ END KillScopeBlock ; (* - ForeachScopeBlockDo - + ForeachScopeBlockDo2 - calls a procedure p for each block of contigeous quadruples + defining an outer scope sb. *) -PROCEDURE ForeachScopeBlockDo (sb: ScopeBlock; p: ScopeProcedure) ; +PROCEDURE ForeachScopeBlockDo2 (sb: ScopeBlock; p: ScopeProcedure2) ; +BEGIN + IF DisplayQuadruples + THEN + printf0 ("ForeachScopeBlockDo\n") + END ; + WHILE sb#NIL DO + WITH sb^ DO + IF DisplayQuadruples + THEN + DisplayScope (sb) + END ; + enter (sb) ; + IF (low # 0) AND (high # 0) + THEN + p (low, high) + END ; + leave (sb) + END ; + sb := sb^.next + END ; + IF DisplayQuadruples + THEN + printf0 ("end ForeachScopeBlockDo\n\n") + END ; +END ForeachScopeBlockDo2 ; + + +(* + ForeachScopeBlockDo3 - calls a procedure p for each block of contigeous quadruples + defining an outer scope sb. +*) + +PROCEDURE ForeachScopeBlockDo3 (sb: ScopeBlock; p: ScopeProcedure3) ; BEGIN IF DisplayQuadruples THEN @@ -438,7 +472,7 @@ BEGIN THEN printf0 ("end ForeachScopeBlockDo\n\n") END ; -END ForeachScopeBlockDo ; +END ForeachScopeBlockDo3 ; (* |