From 3333c549a1247d102718878f176f32cbbd17473d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Thu, 4 Feb 2016 22:05:20 +0100 Subject: [PATCH] bug fix issue #60 --- .../Closure/CapturedVariablesSubstitutor.cs | 12 +++++++++--- TreeConverter/TreeConversion/syntax_tree_visitor.cs | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutor.cs b/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutor.cs index 521b29071..4afcafd68 100644 --- a/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutor.cs +++ b/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutor.cs @@ -662,9 +662,15 @@ namespace TreeConverter.LambdaExpressions.Closure { _visitor.context.SaveContextAndUpToGlobalLevel(); _visitor.lambdaProcessingState = LambdaProcessingState.ClosuresProcessingVisitGeneratedClassesPhase; - procedures.ForEach(p => _visitor.visit(p)); - _visitor.context.RestoreCurrentContext(); - _visitor.lambdaProcessingState = LambdaProcessingState.ClosuresProcessingPhase; + try + { + procedures.ForEach(p => _visitor.visit(p)); + } + finally + { + _visitor.context.RestoreCurrentContext(); + _visitor.lambdaProcessingState = LambdaProcessingState.ClosuresProcessingPhase; + } } private void SubstituteVarDefInProcedure(statement_list statementList) //TODO: сейчас обрабатывается так, как будто блока объявлений declarations в функции нет. Нужно будет предусмотреть, но не только для функций, а еще для всех узлов где есть block, который содержит declarations diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 6e5b36d5a..de817a5b4 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -18047,6 +18047,7 @@ namespace PascalABCCompiler.TreeConverter el.expressions.Add(new SyntaxTree.ident(_function_lambda_call.f_lambda_def.formal_parameters.params_list[i].idents.idents[0].name, _function_lambda_call.source_context)); } SyntaxTree.method_call _method_call = new SyntaxTree.method_call(el); + _method_call.source_context = _function_lambda_call.source_context; if (_method_call is SyntaxTree.dereference) { ((SyntaxTree.dereference)_method_call).dereferencing_value = (SyntaxTree.addressed_value)(new SyntaxTree.ident(_function_lambda_call.f_lambda_def.lambda_name, _function_lambda_call.source_context));