bug fix #698
This commit is contained in:
parent
df01aaaaa8
commit
1749364db4
22
TestSuite/events3.pas
Normal file
22
TestSuite/events3.pas
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
type
|
||||
T1<T> = 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<integer>();
|
||||
Obj.E1 += p;
|
||||
Obj.TryE1();
|
||||
assert(i = 1);
|
||||
end.
|
||||
|
|
@ -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.");
|
||||
|
|
|
|||
Loading…
Reference in a new issue