From a40483346b627bd57325e9a289f63eff10119412 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: Sun, 18 Oct 2015 13:35:44 +0200 Subject: [PATCH] bug fix: can not override virtual methods of abstract class performance improvements --- TestSuite/abstract1.pas | 18 ++++++++ .../convertion_data_and_alghoritms.cs | 15 ++++--- .../TreeConversion/syntax_tree_visitor.cs | 42 +++++++++++++++++-- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/TestSuite/abstract1.pas b/TestSuite/abstract1.pas index 83ce49bde..0af00a458 100644 --- a/TestSuite/abstract1.pas +++ b/TestSuite/abstract1.pas @@ -44,6 +44,21 @@ begin end; end; +TClass7 = abstract class +a: integer; +procedure Test; virtual; +begin +a := 5; +end; +end; + +TClass8 = class(TClass7) +procedure Test; override; +begin +a := 3; +end; +end; + var t : TClass; t2 : TClass3; t3 : TClass5; @@ -55,4 +70,7 @@ t2 := new TClass4; t2.Test2(2.3); t3 := new TClass6; t3.Test3; +var t4 := new TClass8; +t4.Test; +assert(t4.a=3); end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs index b62b5949f..7d66e1c4b 100644 --- a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs +++ b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs @@ -40,7 +40,7 @@ namespace PascalABCCompiler.TreeConverter private T AddError(Errors.Error err) { - syntax_tree_visitor.AddError(err); + syntax_tree_visitor.AddError(err, true); return default(T); } @@ -1789,7 +1789,7 @@ namespace PascalABCCompiler.TreeConverter if (set_of_possible_functions.Count==0 && indefinits.Count == 0) { - AddError(new NoFunctionWithSameParametresNum(loc, is_alone_method_defined, first_function)); + return AddError(new NoFunctionWithSameParametresNum(loc, is_alone_method_defined, first_function)); } //(ssyy) Инициализируем is_alone_defined @@ -1866,10 +1866,10 @@ namespace PascalABCCompiler.TreeConverter if (set_of_possible_functions.Count==0 && indefinits.Count == 0) { if (_is_assigment && parameters.Count == 2) - AddError(new CanNotConvertTypes(parameters[1], parameters[1].type, parameters[0].type, parameters[1].location)); + return AddError(new CanNotConvertTypes(parameters[1], parameters[1].type, parameters[0].type, parameters[1].location)); if (_tmp_bfn != null && parameters.Count == 2) - AddError(new OperatorCanNotBeAppliedToThisTypes(_tmp_bfn.name, parameters[0], parameters[1],loc)); - AddError(new NoFunctionWithSameArguments(loc,is_alone_method_defined)); + return AddError(new OperatorCanNotBeAppliedToThisTypes(_tmp_bfn.name, parameters[0], parameters[1],loc)); + return AddError(new NoFunctionWithSameArguments(loc,is_alone_method_defined)); } bool remove=true; @@ -2001,9 +2001,8 @@ namespace PascalABCCompiler.TreeConverter indefinits.AddRange(set_of_possible_functions); return new indefinite_functions_set(indefinits); } - - AddError(new SeveralFunctionsCanBeCalled(loc,set_of_possible_functions)); - return null; + + return AddError(new SeveralFunctionsCanBeCalled(loc,set_of_possible_functions)); } private function_node is_exist_eq_return_value_method(function_node fn, function_node_list funcs) diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index cb4c730f3..9afabd026 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -86,9 +86,21 @@ namespace PascalABCCompiler.TreeConverter return num.ToString(); } - internal void AddError(Errors.Error err) + internal Errors.Error LastError() { - if (ThrowCompilationError || err.MustThrow) + Errors.Error err = ErrorsList[ErrorsList.Count-1]; + ErrorsList.RemoveAt(ErrorsList.Count - 1); + return err; + } + + internal void RemoveLastError() + { + ErrorsList.RemoveAt(ErrorsList.Count - 1); + } + + internal void AddError(Errors.Error err, bool shouldReturn=false) + { + if (ThrowCompilationError || !shouldReturn /*|| err.MustThrow && !shouldReturn*/) { throw err; } @@ -5283,10 +5295,32 @@ namespace PascalABCCompiler.TreeConverter { try { + ThrowCompilationError = false; fn = convertion_data_and_alghoritms.select_function(exprs, si, subloc, syntax_nodes_parameters); + if (fn == null && skip_first_parameter) + { + if (si.Next == null) + { + ThrowCompilationError = true; + throw LastError(); + } + RemoveLastError(); + skip_first_parameter = false; + si = tmp_si; + exprs.remove_at(0); + fn = convertion_data_and_alghoritms.select_function(exprs, si, subloc, syntax_nodes_parameters); + if (fn == null) + { + ThrowCompilationError = true; + throw LastError(); + } + else + RemoveLastError(); + } } catch (Exception ex) { + ThrowCompilationError = true; if (skip_first_parameter) { si = tmp_si; @@ -5296,6 +5330,7 @@ namespace PascalABCCompiler.TreeConverter else throw ex; } + ThrowCompilationError = true; } SemanticTree.IGenericInstance igi = fn as SemanticTree.IGenericInstance; if (igi != null) @@ -11616,14 +11651,13 @@ namespace PascalABCCompiler.TreeConverter { AddError(get_location(_procedure_attributes_list.proc_attributes[i]), "USING_MODIFIERS{0}_{1}_TOGETHER_NOT_ALLOWED", cmn,_procedure_attributes_list.proc_attributes[i].name,override_proc_attr); } - if (!context.converted_type.IsAbstract) + if (!context.converted_type.IsAbstract || true) { is_virtual = true; virtual_proc_attr = _procedure_attributes_list.proc_attributes[i].name; if (!is_abstract) context.set_virtual(cmn); } - break; } case SyntaxTree.proc_attribute.attr_override: