From 88cd8ce925674d60dde6362459b9fa0cbea2e632 Mon Sep 17 00:00:00 2001 From: miks1965 Date: Sun, 17 Jul 2016 10:40:17 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=20=D0=B4=D1=83?= =?UTF-8?q?=D1=80=D0=B0=D1=86=D0=BA=D0=B8=D0=B9=20=D0=BA=D0=BE=D0=B4,=20?= =?UTF-8?q?=D0=B8=D0=B7-=D0=B7=D0=B0=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=B2=20BaseChangeVisitor=20=D0=B2=D1=81?= =?UTF-8?q?=D0=B5=20=D1=83=D0=B7=D0=BB=D1=8B=20=D0=BE=D0=B1=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=D0=B8=D0=BB=D0=B8=D1=81=D1=8C=20=D0=B4=D0=B2=D0=B0=D0=B6?= =?UTF-8?q?=D0=B4=D1=8B.=20=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=20LoweringVisitor,=20=D0=BA=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D1=8B=D0=B9=20=D1=80=D0=B0=D0=BD=D0=B5=D0=B5=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=8D=D1=82=D0=BE=20=D0=B7=D0=B0=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D1=8B=D0=B2=D0=B0=D0=BB=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TestSuite/yieldcapture1.pas | 2 +- .../BaseVisitors/BaseChangeVisitor.cs | 6 +++--- .../YieldVisitors/LoweringVisitor.cs | 12 +++++++++--- .../ProcessYieldsCapturedVars.cs | 10 ++++++---- .../ReplaceYieldWithLamdasVisitor.cs | 15 +++++++++++++++ .../YieldDesugarSyntaxTreeConverter.cs | 2 +- bin/Lib/PABCRtl.dll | Bin 507904 -> 507904 bytes 7 files changed, 35 insertions(+), 12 deletions(-) diff --git a/TestSuite/yieldcapture1.pas b/TestSuite/yieldcapture1.pas index 2dce9fe34..a0173b50b 100644 --- a/TestSuite/yieldcapture1.pas +++ b/TestSuite/yieldcapture1.pas @@ -15,7 +15,7 @@ begin var q := a1.f(Range(1,4)); - var sq := Seq(4,5,6,7); + var sq := Seq(4,5,6,7); Assert(q.Println.SequenceEqual(sq)); Assert(q.Println.SequenceEqual(sq)); end. \ No newline at end of file diff --git a/Yield/SyntaxVisitors/BaseVisitors/BaseChangeVisitor.cs b/Yield/SyntaxVisitors/BaseVisitors/BaseChangeVisitor.cs index 8e41eb5bd..46bad6918 100644 --- a/Yield/SyntaxVisitors/BaseVisitors/BaseChangeVisitor.cs +++ b/Yield/SyntaxVisitors/BaseVisitors/BaseChangeVisitor.cs @@ -14,12 +14,12 @@ namespace SyntaxVisitors private bool _rootAdded = false; public override void DefaultVisit(syntax_tree_node n) { - // frninja 07/12/15 - if (!_rootAdded) + // frninja 07/12/15 - // SSM - это - идиотский код, приводивший к двойному обходу визитором всех узлов + /*if (!_rootAdded) { _rootAdded = true; ProcessNode(n); - } + }*/ // Элементы списков - с конца в начало чтобы можно было эти элементы изменять по ходу (удалять/вставлять/заменять один несколькими) var Сount = n.subnodes_count; diff --git a/Yield/SyntaxVisitors/YieldVisitors/LoweringVisitor.cs b/Yield/SyntaxVisitors/YieldVisitors/LoweringVisitor.cs index e321d5844..3c57e65cf 100644 --- a/Yield/SyntaxVisitors/YieldVisitors/LoweringVisitor.cs +++ b/Yield/SyntaxVisitors/YieldVisitors/LoweringVisitor.cs @@ -149,10 +149,14 @@ namespace SyntaxVisitors stl, WhileCycleType.While); - ReplaceStatement(frch, - SeqStatements(foreachCollVarDef, ass, enumeratorVarDef, whileNode) - ); + var sq = SeqStatements(foreachCollVarDef, ass, enumeratorVarDef, whileNode); + ReplaceStatement(frch,sq); + + visit(whileNode); // Lowering оставшегося whileNode + + //var sl = UpperNodeAs(); + //ProcessNode(sl); // необходимо еще lowerить while - как это сделать лучше - пока не знаю } private expression CreateConditionFromCaseVariant(expression param, expression_list list) @@ -224,6 +228,8 @@ namespace SyntaxVisitors if_node finalIfNode = currentIfNode; ReplaceStatement(csn, finalIfNode); + + visit(finalIfNode); } public override void visit(if_node ifn) diff --git a/Yield/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs b/Yield/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs index 72a7dc9f5..1c3e0964a 100644 --- a/Yield/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs +++ b/Yield/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs @@ -606,7 +606,8 @@ namespace SyntaxVisitors /// /// Объявление метода /// Коллекция посещенных локальных переменных - /*private void CreateLocalVariablesTypeProxies(procedure_definition pd, out IEnumerable localsClonesCollection) + // SSM - Эта функция уже не нужна - я иногда использую ее чтобы посмотреть как выглядит функция после Loweringа + private void CreateLocalVariablesTypeProxies(procedure_definition pd, out IEnumerable localsClonesCollection) { // Выполняем определение типов локальных переменных с автовыводом типов @@ -632,7 +633,7 @@ namespace SyntaxVisitors pd.proc_header.name.meth_name.source_context); // = new method_name("" + pd.proc_header.className.meth_name.className); InsertHelperMethod(pd, pdCloned); // SSM 13.07.16 - вызов этого метода можно не добавлять - }*/ + } /// /// Отображение локальных в клонированные локальные @@ -926,8 +927,9 @@ namespace SyntaxVisitors DeleteRedundantBeginEnds.Accept(pd); // Обработка метода для корректного захвата локальных переменных и их типов - //IEnumerable localsClonesCollection; - //CreateLocalVariablesTypeProxies(pd, out localsClonesCollection); + // - это уже не надо - иногда можно включать чтобы посмотреть, что собой представляет функция после Loweringа + IEnumerable localsClonesCollection; + CreateLocalVariablesTypeProxies(pd, out localsClonesCollection); // frninja 16/11/15: перенес ниже чтобы работал захват для lowered for diff --git a/Yield/SyntaxVisitors/YieldVisitors/ReplaceYieldWithLamdasVisitor.cs b/Yield/SyntaxVisitors/YieldVisitors/ReplaceYieldWithLamdasVisitor.cs index f2f14e62b..7ca28708e 100644 --- a/Yield/SyntaxVisitors/YieldVisitors/ReplaceYieldWithLamdasVisitor.cs +++ b/Yield/SyntaxVisitors/YieldVisitors/ReplaceYieldWithLamdasVisitor.cs @@ -30,6 +30,21 @@ namespace SyntaxVisitors New.ProcessNode(pd); } + public override void visit(procedure_definition pd) + { + DefaultVisit(pd); + } + + public override void visit(statement_list st) + { + DefaultVisit(st); + } + + public override void visit(for_node fn) + { + DefaultVisit(fn); + } + public override void visit(yield_node yn) { var lambdaSearcher = new TreeConverter.LambdaExpressions.LambdaSearcher(yn); diff --git a/Yield/YieldConversionSyntax/YieldDesugarSyntaxTreeConverter.cs b/Yield/YieldConversionSyntax/YieldDesugarSyntaxTreeConverter.cs index b9e84ffd1..52e36e6d4 100644 --- a/Yield/YieldConversionSyntax/YieldDesugarSyntaxTreeConverter.cs +++ b/Yield/YieldConversionSyntax/YieldDesugarSyntaxTreeConverter.cs @@ -28,7 +28,7 @@ namespace YieldDesugarSyntaxTreeConverter root.visit(new ProcessYieldCapturedVarsVisitor()); #if DEBUG - // root.visit(new SimplePrettyPrinterVisitor(@"d:\zzz.txt")); + //root.visit(new SimplePrettyPrinterVisitor(@"d:\zzz.txt")); #endif return root; diff --git a/bin/Lib/PABCRtl.dll b/bin/Lib/PABCRtl.dll index a6968f59ac176d95517a22306a7a34446b9b73e7..19d586353a5229bb4977403eaf2604dc1d0d0b5e 100644 GIT binary patch delta 254 zcmZo@kZ)*^pU}a~qSHOG+m|`v2Ych~*4vD&x0$xyX5KNoep{!V70=h4HJ)O(@?Y;M zW}dE=uy$P-|4W0DFZSO17T;ahJ%0M6`z1?F@UO1#>XV(so9z@Bm4qh< zpFG#JAoZ3cLnrf*vS=Bh%h%#~r=8m?v9;*M*PN>!5s%{E8Xx#xI{R^+vu5+{qDyY) z%Pnhn``35JeyclRyuFNZcDwLgW*}w(V%F`#bJ=cY3xs@$+L7%y*K>czyJ;2IZJW3M z;b4EUNeAeKa0Vb?0%8>q0|@@?W@iWrb_t&P$NX`d!ZG(ndtHi`M;~t9F0hCF12X^* C$a2g8 delta 254 zcmZo@kZ)*^pU}bVx2R)cw=XkG3rFMa*4vD&x0$xyX5KNo-oWUB&knPSVvl9Y(+ur@ zHh!z;Ijr)%b={7MSCYkYi)1eD31_j&6>Tg3DDr5H%=T2nn-}hG)h;NkJfP8U9ByH< z@ef&v-@dn1ccHz0qK+FQftlNd>vfa!Un0!zB&&*BrE>m<)^=