From 8b6fbc3edf1adecdee89a68dcc1cc2dd7a0e2c35 Mon Sep 17 00:00:00 2001 From: Oleg Batashov Date: Fri, 20 May 2016 17:08:56 +0300 Subject: [PATCH] Yield helper methods remove speedup --- SyntaxTree/tree/TreeHelper.cs | 4 +++ .../TreeConversion/syntax_tree_visitor.cs | 19 ++++++++-- TreeConverter/TreeRealization/functions.cs | 34 ++++++++++++++++++ .../ProcessYieldsCapturedVars.cs | 5 ++- bin/Lib/PABCRtl.dll | Bin 505856 -> 505856 bytes 5 files changed, 59 insertions(+), 3 deletions(-) diff --git a/SyntaxTree/tree/TreeHelper.cs b/SyntaxTree/tree/TreeHelper.cs index eee5185b9..610f9b5c2 100644 --- a/SyntaxTree/tree/TreeHelper.cs +++ b/SyntaxTree/tree/TreeHelper.cs @@ -557,6 +557,10 @@ namespace PascalABCCompiler.SyntaxTree public partial class procedure_definition { public bool has_yield = false; + // frninja 20/05/16 - для методов хелперов yield + public bool is_yield_helper = false; + // end frninja + public procedure_definition(procedure_header proc_header, proc_block proc_body, SourceContext sc) { this.proc_header = proc_header; diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 3c2b23f8a..976fe2c59 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -3699,6 +3699,13 @@ namespace PascalABCCompiler.TreeConverter if (cmn != null) { + // frninja 20/05/16 - ставим флаг is_yield_helper + if (sd is SyntaxTree.procedure_definition) + { + cmn.is_yield_helper = (sd as SyntaxTree.procedure_definition).is_yield_helper; + } + // end frninja + context.push_function(cmn); if (!cmn.IsStatic) { @@ -9645,7 +9652,7 @@ namespace PascalABCCompiler.TreeConverter // frninja 28/04/16 - режем мусорные методы хелперы yield { - var toRemove = cnsn.functions.Where(m => m.name.StartsWith(YieldHelpers.YieldConsts.YieldHelperMethodPrefix)).ToArray(); + var toRemove = cnsn.functions.Where(m => m.is_yield_helper).ToArray(); foreach (var m in toRemove) { cnsn.functions.remove(m); @@ -10345,7 +10352,7 @@ namespace PascalABCCompiler.TreeConverter // frninja 28/04/16 - режем мусорные методы хелперы yield { - var toRemove = ctn.methods.Where(m => m.name.StartsWith(YieldHelpers.YieldConsts.YieldHelperMethodPrefix)).ToArray(); + var toRemove = ctn.methods.Where(m => m.is_yield_helper).ToArray(); foreach (var m in toRemove) { ctn.methods.remove(m); @@ -11246,6 +11253,14 @@ namespace PascalABCCompiler.TreeConverter { return; } + + // frninja 20/05/16 - ставим флаг is_yield_helper + if (context.top_function is common_namespace_function_node) + { + (context.top_function as common_namespace_function_node).is_yield_helper = _procedure_definition.is_yield_helper; + } + // end frninja + if (context.converted_explicit_interface_type != null) (context.top_function as common_method_node).explicit_interface = context.converted_explicit_interface_type; if (has_dll_import_attribute(context.top_function)) diff --git a/TreeConverter/TreeRealization/functions.cs b/TreeConverter/TreeRealization/functions.cs index d3b15b6f5..d1e4c4c3e 100644 --- a/TreeConverter/TreeRealization/functions.cs +++ b/TreeConverter/TreeRealization/functions.cs @@ -1086,6 +1086,22 @@ namespace PascalABCCompiler.TreeRealization public type_node ConnectedToType = null; + // frninja 20/05/16 + private bool _is_yield_helper = false; + + public bool is_yield_helper + { + get + { + return _is_yield_helper; + } + set + { + _is_yield_helper = value; + } + } + // end frninja + public override bool is_extension_method { get @@ -1325,6 +1341,24 @@ namespace PascalABCCompiler.TreeRealization } } + // frninja 20/05/16 + + private bool _is_yield_helper = false; + + public bool is_yield_helper + { + get + { + return _is_yield_helper; + } + set + { + _is_yield_helper = value; + } + } + // end frninja + + public override bool is_final { get diff --git a/Yield/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs b/Yield/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs index 3e0e270f3..88b5f2c84 100644 --- a/Yield/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs +++ b/Yield/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs @@ -471,6 +471,8 @@ namespace SyntaxVisitors // Добавляем в класс метод с обертками для локальных переменных pdCloned.proc_header.name.meth_name = new ident(YieldConsts.YieldHelperMethodPrefix+ "_locals_type_detector>" + pd.proc_header.name.meth_name.name); // = new method_name("" + pd.proc_header.className.meth_name.className); + pdCloned.is_yield_helper = true; + if (IsClassMethod(pd)) { var cd = UpperTo(); @@ -770,7 +772,8 @@ namespace SyntaxVisitors // Вставляем классы-хелперы InsertYieldHelpers(pd, cct); - + // frninja 20/05/16 - фикс для повторного обхода + pd.has_yield = false; //mids = null; // вдруг мы выйдем из процедуры, не зайдем в другую, а там - оператор! Такого конечно не может быть } diff --git a/bin/Lib/PABCRtl.dll b/bin/Lib/PABCRtl.dll index 4b0a9237287f85c15a18fa19148c31d7cfbbd69d..dd8e364212405840616226984d09de8516af9640 100644 GIT binary patch delta 253 zcmZqpAlL9gZbAn$gQWe$ZeJ$*4UM;2Z!xysV%mC(`Q?myKS_lLOj1iX?P}TZqM5<6 zOX7}2d9~%)oexa5>9%TTAJUBX;W@kPS8CUppG&Zpj=9IH~Bno)h9`k5trJ>z#rPV8R5lfByh zpMlYNjoDkb{F-s%m@6YkyYnn&AZ7t#*6q%-*dj9p()~9-+3otnZ{h;2`#)L^IBj3U z%-*t52k3)v1|VPpVigbr2t2m3GXw>@1V7#{GxL;Xg5R{&lLaUEPD|V#vz2`b699D! BY{dWo delta 253 zcmZqpAlL9gZbAq1yjM08yM38_wl&^ry~Wsii)rgE=9e?-zd0FR4)vci>s;ZJM8>qw zGdrg2h*8n{{=}qyDnHZ7Mp6Dv*AfeJ|B0*1OrL3FQT8}dVe3~x`=9@Q_;2Da=Df_P z|Jci+@cWUIzeAi9IY0gW746cwBtWI>1FI!lXn(BYlX@99v9DUKm$kD>CNEI&@t#{Z z+j{q3tLQkZKw$~H&5Vxi&a;?-m<5Pgw>!^bi_8>o6SIgmvi;$)FMo~!^GWNv?Q59X zTQ=$deGtw71WZ7z0%8Dx$5wWRpkSBaZ0Wtbt{Z;yn|b4T(UOzxsoP_=vM*r*08l4t A?EnA(