|
@@ -26354,55 +26354,82 @@ begin
|
|
Add([
|
|
Add([
|
|
'{$modeswitch externalclass}',
|
|
'{$modeswitch externalclass}',
|
|
'type',
|
|
'type',
|
|
|
|
+ ' TProc = reference to procedure(i: longint); safecall;',
|
|
' TEvent = procedure(i: longint) of object; safecall;',
|
|
' TEvent = procedure(i: longint) of object; safecall;',
|
|
' TExtA = class external name ''ExtObj''',
|
|
' TExtA = class external name ''ExtObj''',
|
|
' procedure DoIt(Id: longint = 1); external name ''$Execute'';',
|
|
' procedure DoIt(Id: longint = 1); external name ''$Execute'';',
|
|
' procedure DoSome(Id: longint = 1);',
|
|
' procedure DoSome(Id: longint = 1);',
|
|
' procedure SetOnClick(const e: TEvent);',
|
|
' procedure SetOnClick(const e: TEvent);',
|
|
' property OnClick: TEvent write SetOnClick;',
|
|
' property OnClick: TEvent write SetOnClick;',
|
|
|
|
+ ' class procedure Fly(Id: longint = 1); static;',
|
|
|
|
+ ' procedure SetOnShow(const p: TProc);',
|
|
|
|
+ ' property OnShow: TProc write SetOnShow;',
|
|
' end;',
|
|
' end;',
|
|
|
|
+ 'procedure Run(i: longint = 1);',
|
|
|
|
+ 'begin',
|
|
|
|
+ 'end;',
|
|
'var',
|
|
'var',
|
|
' Obj: texta;',
|
|
' Obj: texta;',
|
|
- ' p: TEvent;',
|
|
|
|
|
|
+ ' e: TEvent;',
|
|
|
|
+ ' p: TProc;',
|
|
'begin',
|
|
'begin',
|
|
- ' p:=p;',
|
|
|
|
- ' p:[email protected];',
|
|
|
|
- ' p:[email protected];',
|
|
|
|
- ' p:=TEvent(@obj.dosome);', // no safecall
|
|
|
|
|
|
+ ' e:=e;',
|
|
|
|
+ ' e:[email protected];',
|
|
|
|
+ ' e:[email protected];',
|
|
|
|
+ ' e:=TEvent(@obj.dosome);', // no safecall
|
|
' obj.OnClick:[email protected];',
|
|
' obj.OnClick:[email protected];',
|
|
' obj.OnClick:[email protected];',
|
|
' obj.OnClick:[email protected];',
|
|
' obj.setonclick(@obj.doit);',
|
|
' obj.setonclick(@obj.doit);',
|
|
' obj.setonclick(@obj.dosome);',
|
|
' obj.setonclick(@obj.dosome);',
|
|
|
|
+ ' p:=@Run;',
|
|
|
|
+ ' p:[email protected];',
|
|
|
|
+ ' obj.OnShow:=@Run;',
|
|
|
|
+ ' obj.OnShow:[email protected];',
|
|
|
|
+ ' obj.setOnShow(@Run);',
|
|
|
|
+ ' obj.setOnShow(@TExtA.Fly);',
|
|
' with obj do begin',
|
|
' with obj do begin',
|
|
- ' p:=@doit;',
|
|
|
|
- ' p:=@dosome;',
|
|
|
|
|
|
+ ' e:=@doit;',
|
|
|
|
+ ' e:=@dosome;',
|
|
' OnClick:=@doit;',
|
|
' OnClick:=@doit;',
|
|
' OnClick:=@dosome;',
|
|
' OnClick:=@dosome;',
|
|
' setonclick(@doit);',
|
|
' setonclick(@doit);',
|
|
' setonclick(@dosome);',
|
|
' setonclick(@dosome);',
|
|
|
|
+ ' OnShow:=@Run;',
|
|
|
|
+ ' setOnShow(@Run);',
|
|
' end;']);
|
|
' end;']);
|
|
ConvertProgram;
|
|
ConvertProgram;
|
|
CheckSource('TestProcType_SafeCallObjFPC',
|
|
CheckSource('TestProcType_SafeCallObjFPC',
|
|
LinesToStr([ // statements
|
|
LinesToStr([ // statements
|
|
|
|
+ 'this.Run = function (i) {',
|
|
|
|
+ '};',
|
|
'this.Obj = null;',
|
|
'this.Obj = null;',
|
|
|
|
+ 'this.e = null;',
|
|
'this.p = null;',
|
|
'this.p = null;',
|
|
'']),
|
|
'']),
|
|
LinesToStr([ // $mod.$main
|
|
LinesToStr([ // $mod.$main
|
|
- '$mod.p = $mod.p;',
|
|
|
|
- '$mod.p = rtl.createSafeCallback($mod.Obj, "$Execute");',
|
|
|
|
- '$mod.p = rtl.createSafeCallback($mod.Obj, "DoSome");',
|
|
|
|
- '$mod.p = rtl.createCallback($mod.Obj, "DoSome");',
|
|
|
|
|
|
+ '$mod.e = $mod.e;',
|
|
|
|
+ '$mod.e = rtl.createSafeCallback($mod.Obj, "$Execute");',
|
|
|
|
+ '$mod.e = rtl.createSafeCallback($mod.Obj, "DoSome");',
|
|
|
|
+ '$mod.e = rtl.createCallback($mod.Obj, "DoSome");',
|
|
'$mod.Obj.SetOnClick(rtl.createSafeCallback($mod.Obj, "$Execute"));',
|
|
'$mod.Obj.SetOnClick(rtl.createSafeCallback($mod.Obj, "$Execute"));',
|
|
'$mod.Obj.SetOnClick(rtl.createSafeCallback($mod.Obj, "DoSome"));',
|
|
'$mod.Obj.SetOnClick(rtl.createSafeCallback($mod.Obj, "DoSome"));',
|
|
'$mod.Obj.SetOnClick(rtl.createSafeCallback($mod.Obj, "$Execute"));',
|
|
'$mod.Obj.SetOnClick(rtl.createSafeCallback($mod.Obj, "$Execute"));',
|
|
'$mod.Obj.SetOnClick(rtl.createSafeCallback($mod.Obj, "DoSome"));',
|
|
'$mod.Obj.SetOnClick(rtl.createSafeCallback($mod.Obj, "DoSome"));',
|
|
|
|
+ '$mod.p = rtl.createSafeCallback($mod, "Run");',
|
|
|
|
+ '$mod.p = rtl.createSafeCallback(ExtObj, "Fly");',
|
|
|
|
+ '$mod.Obj.SetOnShow(rtl.createSafeCallback($mod, "Run"));',
|
|
|
|
+ '$mod.Obj.SetOnShow(rtl.createSafeCallback(ExtObj, "Fly"));',
|
|
|
|
+ '$mod.Obj.SetOnShow(rtl.createSafeCallback($mod, "Run"));',
|
|
|
|
+ '$mod.Obj.SetOnShow(rtl.createSafeCallback(ExtObj, "Fly"));',
|
|
'var $with1 = $mod.Obj;',
|
|
'var $with1 = $mod.Obj;',
|
|
- '$mod.p = rtl.createSafeCallback($with1, "$Execute");',
|
|
|
|
- '$mod.p = rtl.createSafeCallback($with1, "DoSome");',
|
|
|
|
|
|
+ '$mod.e = rtl.createSafeCallback($with1, "$Execute");',
|
|
|
|
+ '$mod.e = rtl.createSafeCallback($with1, "DoSome");',
|
|
'$with1.SetOnClick(rtl.createSafeCallback($with1, "$Execute"));',
|
|
'$with1.SetOnClick(rtl.createSafeCallback($with1, "$Execute"));',
|
|
'$with1.SetOnClick(rtl.createSafeCallback($with1, "DoSome"));',
|
|
'$with1.SetOnClick(rtl.createSafeCallback($with1, "DoSome"));',
|
|
'$with1.SetOnClick(rtl.createSafeCallback($with1, "$Execute"));',
|
|
'$with1.SetOnClick(rtl.createSafeCallback($with1, "$Execute"));',
|
|
'$with1.SetOnClick(rtl.createSafeCallback($with1, "DoSome"));',
|
|
'$with1.SetOnClick(rtl.createSafeCallback($with1, "DoSome"));',
|
|
|
|
+ '$with1.SetOnShow(rtl.createSafeCallback($mod, "Run"));',
|
|
|
|
+ '$with1.SetOnShow(rtl.createSafeCallback($mod, "Run"));',
|
|
'']));
|
|
'']));
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -26413,55 +26440,82 @@ begin
|
|
'{$mode delphi}',
|
|
'{$mode delphi}',
|
|
'{$modeswitch externalclass}',
|
|
'{$modeswitch externalclass}',
|
|
'type',
|
|
'type',
|
|
|
|
+ ' TProc = reference to procedure(i: longint); safecall;',
|
|
' TEvent = procedure(i: longint) of object; safecall;',
|
|
' TEvent = procedure(i: longint) of object; safecall;',
|
|
' TExtA = class external name ''ExtObj''',
|
|
' TExtA = class external name ''ExtObj''',
|
|
' procedure DoIt(Id: longint = 1); external name ''$Execute'';',
|
|
' procedure DoIt(Id: longint = 1); external name ''$Execute'';',
|
|
' procedure DoSome(Id: longint = 1);',
|
|
' procedure DoSome(Id: longint = 1);',
|
|
' procedure SetOnClick(const e: TEvent);',
|
|
' procedure SetOnClick(const e: TEvent);',
|
|
' property OnClick: TEvent write SetOnClick;',
|
|
' property OnClick: TEvent write SetOnClick;',
|
|
|
|
+ ' class procedure Fly(Id: longint = 1); static;',
|
|
|
|
+ ' procedure SetOnShow(const p: TProc);',
|
|
|
|
+ ' property OnShow: TProc write SetOnShow;',
|
|
' end;',
|
|
' end;',
|
|
|
|
+ 'procedure Run(i: longint = 1);',
|
|
|
|
+ 'begin',
|
|
|
|
+ 'end;',
|
|
'var',
|
|
'var',
|
|
' Obj: texta;',
|
|
' Obj: texta;',
|
|
- ' p: TEvent;',
|
|
|
|
|
|
+ ' e: TEvent;',
|
|
|
|
+ ' p: TProc;',
|
|
'begin',
|
|
'begin',
|
|
- ' p:=p;',
|
|
|
|
- ' p:=obj.doit;',
|
|
|
|
- ' p:=obj.dosome;',
|
|
|
|
- ' p:=TEvent(@obj.dosome);', // no safecall
|
|
|
|
|
|
+ ' e:=e;',
|
|
|
|
+ ' e:=obj.doit;',
|
|
|
|
+ ' e:=obj.dosome;',
|
|
|
|
+ ' e:=TEvent(@obj.dosome);', // no safecall
|
|
' obj.OnClick:=obj.doit;',
|
|
' obj.OnClick:=obj.doit;',
|
|
' obj.OnClick:=obj.dosome;',
|
|
' obj.OnClick:=obj.dosome;',
|
|
' obj.setonclick(obj.doit);',
|
|
' obj.setonclick(obj.doit);',
|
|
' obj.setonclick(obj.dosome);',
|
|
' obj.setonclick(obj.dosome);',
|
|
|
|
+ ' p:=Run;',
|
|
|
|
+ ' p:=TExtA.Fly;',
|
|
|
|
+ ' obj.OnShow:=Run;',
|
|
|
|
+ ' obj.OnShow:=TExtA.Fly;',
|
|
|
|
+ ' obj.setOnShow(Run);',
|
|
|
|
+ ' obj.setOnShow(TExtA.Fly);',
|
|
' with obj do begin',
|
|
' with obj do begin',
|
|
- ' p:=doit;',
|
|
|
|
- ' p:=dosome;',
|
|
|
|
|
|
+ ' e:=doit;',
|
|
|
|
+ ' e:=dosome;',
|
|
' OnClick:=doit;',
|
|
' OnClick:=doit;',
|
|
' OnClick:=dosome;',
|
|
' OnClick:=dosome;',
|
|
' setonclick(doit);',
|
|
' setonclick(doit);',
|
|
' setonclick(dosome);',
|
|
' setonclick(dosome);',
|
|
|
|
+ ' OnShow:=@Run;',
|
|
|
|
+ ' setOnShow(@Run);',
|
|
' end;']);
|
|
' end;']);
|
|
ConvertProgram;
|
|
ConvertProgram;
|
|
CheckSource('TestProcType_SafeCallDelphi',
|
|
CheckSource('TestProcType_SafeCallDelphi',
|
|
LinesToStr([ // statements
|
|
LinesToStr([ // statements
|
|
|
|
+ 'this.Run = function (i) {',
|
|
|
|
+ '};',
|
|
'this.Obj = null;',
|
|
'this.Obj = null;',
|
|
|
|
+ 'this.e = null;',
|
|
'this.p = null;',
|
|
'this.p = null;',
|
|
'']),
|
|
'']),
|
|
LinesToStr([ // $mod.$main
|
|
LinesToStr([ // $mod.$main
|
|
- '$mod.p = $mod.p;',
|
|
|
|
- '$mod.p = rtl.createSafeCallback($mod.Obj, "$Execute");',
|
|
|
|
- '$mod.p = rtl.createSafeCallback($mod.Obj, "DoSome");',
|
|
|
|
- '$mod.p = rtl.createCallback($mod.Obj, "DoSome");',
|
|
|
|
|
|
+ '$mod.e = $mod.e;',
|
|
|
|
+ '$mod.e = rtl.createSafeCallback($mod.Obj, "$Execute");',
|
|
|
|
+ '$mod.e = rtl.createSafeCallback($mod.Obj, "DoSome");',
|
|
|
|
+ '$mod.e = rtl.createCallback($mod.Obj, "DoSome");',
|
|
'$mod.Obj.SetOnClick(rtl.createSafeCallback($mod.Obj, "$Execute"));',
|
|
'$mod.Obj.SetOnClick(rtl.createSafeCallback($mod.Obj, "$Execute"));',
|
|
'$mod.Obj.SetOnClick(rtl.createSafeCallback($mod.Obj, "DoSome"));',
|
|
'$mod.Obj.SetOnClick(rtl.createSafeCallback($mod.Obj, "DoSome"));',
|
|
'$mod.Obj.SetOnClick(rtl.createSafeCallback($mod.Obj, "$Execute"));',
|
|
'$mod.Obj.SetOnClick(rtl.createSafeCallback($mod.Obj, "$Execute"));',
|
|
'$mod.Obj.SetOnClick(rtl.createSafeCallback($mod.Obj, "DoSome"));',
|
|
'$mod.Obj.SetOnClick(rtl.createSafeCallback($mod.Obj, "DoSome"));',
|
|
|
|
+ '$mod.p = rtl.createSafeCallback($mod, "Run");',
|
|
|
|
+ '$mod.p = rtl.createSafeCallback(ExtObj, "Fly");',
|
|
|
|
+ '$mod.Obj.SetOnShow(rtl.createSafeCallback($mod, "Run"));',
|
|
|
|
+ '$mod.Obj.SetOnShow(rtl.createSafeCallback(ExtObj, "Fly"));',
|
|
|
|
+ '$mod.Obj.SetOnShow(rtl.createSafeCallback($mod, "Run"));',
|
|
|
|
+ '$mod.Obj.SetOnShow(rtl.createSafeCallback(ExtObj, "Fly"));',
|
|
'var $with1 = $mod.Obj;',
|
|
'var $with1 = $mod.Obj;',
|
|
- '$mod.p = rtl.createSafeCallback($with1, "$Execute");',
|
|
|
|
- '$mod.p = rtl.createSafeCallback($with1, "DoSome");',
|
|
|
|
|
|
+ '$mod.e = rtl.createSafeCallback($with1, "$Execute");',
|
|
|
|
+ '$mod.e = rtl.createSafeCallback($with1, "DoSome");',
|
|
'$with1.SetOnClick(rtl.createSafeCallback($with1, "$Execute"));',
|
|
'$with1.SetOnClick(rtl.createSafeCallback($with1, "$Execute"));',
|
|
'$with1.SetOnClick(rtl.createSafeCallback($with1, "DoSome"));',
|
|
'$with1.SetOnClick(rtl.createSafeCallback($with1, "DoSome"));',
|
|
'$with1.SetOnClick(rtl.createSafeCallback($with1, "$Execute"));',
|
|
'$with1.SetOnClick(rtl.createSafeCallback($with1, "$Execute"));',
|
|
'$with1.SetOnClick(rtl.createSafeCallback($with1, "DoSome"));',
|
|
'$with1.SetOnClick(rtl.createSafeCallback($with1, "DoSome"));',
|
|
|
|
+ '$with1.SetOnShow(rtl.createSafeCallback($mod, "Run"));',
|
|
|
|
+ '$with1.SetOnShow(rtl.createSafeCallback($mod, "Run"));',
|
|
'']));
|
|
'']));
|
|
end;
|
|
end;
|
|
|
|
|