From 636301ae02db3b0a1ac2a7d2d3a702868c2190ea 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, 29 Jun 2017 21:05:37 +0200 Subject: [PATCH] bug fix #432 --- Optimizer/Optimizer.cs | 12 +++++++++--- _BuildDebug.bat | 6 ++++++ 2 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 _BuildDebug.bat diff --git a/Optimizer/Optimizer.cs b/Optimizer/Optimizer.cs index ec467d613..1f9fef11c 100644 --- a/Optimizer/Optimizer.cs +++ b/Optimizer/Optimizer.cs @@ -16,7 +16,8 @@ public class Optimizer private bool extended_mode = true; private common_type_node current_type; private bool condition_block = false; - + private bool has_returns = false; + public Optimizer() { } @@ -133,6 +134,7 @@ private void VisitMethod(common_method_node cmn) foreach (common_in_function_function_node nested in cmn.functions_nodes_list) VisitNestedFunction(nested); current_function = cmn; + has_returns = false; VisitStatement(cmn.function_code); foreach (var_definition_node vdn2 in cmn.var_definition_nodes_list) { @@ -250,6 +252,7 @@ private void VisitCommonNamespaceFunctionNode(common_namespace_function_node cnf foreach (common_in_function_function_node nested in cnfn.functions_nodes_list) VisitNestedFunction(nested); current_function = cnfn; + has_returns = false; VisitStatement(cnfn.function_code); foreach (var_definition_node vdn2 in cnfn.var_definition_nodes_list) { @@ -318,6 +321,7 @@ private void VisitNestedFunction(common_in_function_function_node cnfn) foreach (common_in_function_function_node nested in cnfn.functions_nodes_list) VisitNestedFunction(nested); current_function = cnfn; + has_returns = false; VisitStatement(cnfn.function_code); foreach (var_definition_node vdn2 in cnfn.var_definition_nodes_list) { @@ -431,13 +435,13 @@ private RetVal GetConstantValue(expression_node en) private void CheckInfiniteRecursion(common_namespace_function_call cnfc) { - if (!condition_block && cnfc.function_node == current_function) + if (!condition_block && !has_returns && cnfc.function_node == current_function) warns.Add(new InfiniteRecursion(cnfc.location)); } private void CheckInfiniteRecursion(common_static_method_call cnfc) { - if (!condition_block && cnfc.function_node == current_function) + if (!condition_block && !has_returns && cnfc.function_node == current_function) warns.Add(new InfiniteRecursion(cnfc.location)); } @@ -606,6 +610,7 @@ private void VisitThrow(throw_statement_node stmt) { VisitExpression(stmt.excpetion); is_break_stmt = true; + has_returns = true; } private void VisitTryBlock(try_block stmt) @@ -782,6 +787,7 @@ private void VisitExpression(expression_node en) { case semantic_node_type.exit_procedure: /*ничего писать не надо*/ + has_returns = true; break; case semantic_node_type.typeof_operator: //VisitTypeOfOperator((typeof_operator)en); diff --git a/_BuildDebug.bat b/_BuildDebug.bat new file mode 100644 index 000000000..00ce611f6 --- /dev/null +++ b/_BuildDebug.bat @@ -0,0 +1,6 @@ +if exist "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\msbuild.exe" ( +"%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\msbuild.exe" PascalABCNET.sln +) else ( +"%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe" PascalABCNET.sln +) +@IF %ERRORLEVEL% NEQ 0 PAUSE \ No newline at end of file