From 1749364db411f6cae3d6033cd1bc67114f151886 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, 11 Mar 2018 19:01:24 +0100 Subject: [PATCH] bug fix #698 --- TestSuite/events3.pas | 22 ++++++++++++++++++++ TreeConverter/TreeRealization/generics.cs | 25 ++++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 TestSuite/events3.pas diff --git a/TestSuite/events3.pas b/TestSuite/events3.pas new file mode 100644 index 000000000..592a2e686 --- /dev/null +++ b/TestSuite/events3.pas @@ -0,0 +1,22 @@ +type + T1 = class + event E1: procedure; + + procedure TryE1(); + begin + if E1 <> nil then E1(); + end; + end; + +var i: integer; +procedure p; +begin + i := 1; +end; + +begin + var Obj := new T1(); + Obj.E1 += p; + Obj.TryE1(); + assert(i = 1); +end. \ No newline at end of file diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index a3adc1d21..455e93893 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -1554,6 +1554,28 @@ namespace PascalABCCompiler.TreeRealization } } + protected common_event make_event(event_node orig_event, location loc) + { + common_event cme = orig_event as common_event; + compiled_event ce = orig_event as compiled_event; + if (_members[orig_event.add_method] == null) + ConvertMember(orig_event.add_method); + if (_members[orig_event.remove_method] == null) + ConvertMember(orig_event.remove_method); + if (orig_event.raise_method != null && _members[orig_event.raise_method] == null) + ConvertMember(orig_event.raise_method); + common_event evnt = new common_event(orig_event.name, generic_convertions.determine_type( + orig_event.delegate_type, _instance_params, false), this, + _members[orig_event.add_method] as common_method_node, + _members[orig_event.remove_method] as common_method_node, + orig_event.raise_method != null ? _members[orig_event.raise_method] as common_method_node : null, + cme != null ? cme.field_access_level : SemanticTree.field_access_level.fal_public, + orig_event.is_static ? SemanticTree.polymorphic_state.ps_static : SemanticTree.polymorphic_state.ps_common, + loc + ); + return evnt; + } + protected common_property_node make_property(property_node orig_pn, location loc) { AddPropertyAccessors(orig_pn); @@ -1718,7 +1740,8 @@ namespace PascalABCCompiler.TreeRealization break; case general_node_type.event_node: //(ssyy) Не знаю, что тут делать - rez_node = orig_node; + event_node orig_event = (event_node)orig_node; + rez_node = make_event(orig_event, loc); break; default: throw new CompilerInternalError("Unexpected definition_node.");