mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 01:29:19 +02:00
compiler: call gen_intf_wrappers not only for unit symtables but also for syntables of records and object types because they can contain nested classes (bug #0018610)
git-svn-id: trunk@16818 -
This commit is contained in:
parent
6bad2fa169
commit
0f35da07f1
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -10959,6 +10959,7 @@ tests/webtbs/tw1851.pp svneol=native#text/plain
|
|||||||
tests/webtbs/tw18512.pp svneol=native#text/pascal
|
tests/webtbs/tw18512.pp svneol=native#text/pascal
|
||||||
tests/webtbs/tw1856.pp svneol=native#text/plain
|
tests/webtbs/tw1856.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw18567 svneol=native#text/pascal
|
tests/webtbs/tw18567 svneol=native#text/pascal
|
||||||
|
tests/webtbs/tw18610.pp svneol=native#text/pascal
|
||||||
tests/webtbs/tw1862.pp svneol=native#text/plain
|
tests/webtbs/tw1862.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw1863.pp svneol=native#text/plain
|
tests/webtbs/tw1863.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw1867.pp svneol=native#text/plain
|
tests/webtbs/tw1867.pp svneol=native#text/plain
|
||||||
|
@ -101,7 +101,7 @@ interface
|
|||||||
procedure gen_load_return_value(list:TAsmList);
|
procedure gen_load_return_value(list:TAsmList);
|
||||||
|
|
||||||
procedure gen_external_stub(list:TAsmList;pd:tprocdef;const externalname:string);
|
procedure gen_external_stub(list:TAsmList;pd:tprocdef;const externalname:string);
|
||||||
procedure gen_intf_wrappers(list:TAsmList;st:TSymtable);
|
procedure gen_intf_wrappers(list:TAsmList;st:TSymtable;nested:boolean);
|
||||||
procedure gen_load_vmt_register(list:TAsmList;objdef:tobjectdef;selfloc:tlocation;var vmtreg:tregister);
|
procedure gen_load_vmt_register(list:TAsmList;objdef:tobjectdef;selfloc:tlocation;var vmtreg:tregister);
|
||||||
|
|
||||||
procedure get_used_regvars(n: tnode; var rv: tusedregvars);
|
procedure get_used_regvars(n: tnode; var rv: tusedregvars);
|
||||||
@ -2963,19 +2963,24 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure gen_intf_wrappers(list:TAsmList;st:TSymtable);
|
procedure gen_intf_wrappers(list:TAsmList;st:TSymtable;nested:boolean);
|
||||||
var
|
var
|
||||||
i : longint;
|
i : longint;
|
||||||
def : tdef;
|
def : tdef;
|
||||||
begin
|
begin
|
||||||
create_codegen;
|
if not nested then
|
||||||
|
create_codegen;
|
||||||
for i:=0 to st.DefList.Count-1 do
|
for i:=0 to st.DefList.Count-1 do
|
||||||
begin
|
begin
|
||||||
def:=tdef(st.DefList[i]);
|
def:=tdef(st.DefList[i]);
|
||||||
|
{ if def can contain nested types then handle it symtable }
|
||||||
|
if def.typ in [objectdef,recorddef] then
|
||||||
|
gen_intf_wrappers(list,tabstractrecorddef(def).symtable,true);
|
||||||
if is_class(def) then
|
if is_class(def) then
|
||||||
gen_intf_wrapper(list,tobjectdef(def));
|
gen_intf_wrapper(list,tobjectdef(def));
|
||||||
end;
|
end;
|
||||||
destroy_codegen;
|
if not nested then
|
||||||
|
destroy_codegen;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1360,8 +1360,8 @@ implementation
|
|||||||
maybeloadvariantsunit;
|
maybeloadvariantsunit;
|
||||||
|
|
||||||
{ generate wrappers for interfaces }
|
{ generate wrappers for interfaces }
|
||||||
gen_intf_wrappers(current_asmdata.asmlists[al_procedures],current_module.globalsymtable);
|
gen_intf_wrappers(current_asmdata.asmlists[al_procedures],current_module.globalsymtable,false);
|
||||||
gen_intf_wrappers(current_asmdata.asmlists[al_procedures],current_module.localsymtable);
|
gen_intf_wrappers(current_asmdata.asmlists[al_procedures],current_module.localsymtable,false);
|
||||||
|
|
||||||
{ generate pic helpers to load eip if necessary }
|
{ generate pic helpers to load eip if necessary }
|
||||||
gen_pic_helpers(current_asmdata.asmlists[al_procedures]);
|
gen_pic_helpers(current_asmdata.asmlists[al_procedures]);
|
||||||
@ -2333,7 +2333,7 @@ implementation
|
|||||||
MaybeGenerateObjectiveCImageInfo(nil,current_module.localsymtable);
|
MaybeGenerateObjectiveCImageInfo(nil,current_module.localsymtable);
|
||||||
|
|
||||||
{ generate wrappers for interfaces }
|
{ generate wrappers for interfaces }
|
||||||
gen_intf_wrappers(current_asmdata.asmlists[al_procedures],current_module.localsymtable);
|
gen_intf_wrappers(current_asmdata.asmlists[al_procedures],current_module.localsymtable,false);
|
||||||
|
|
||||||
{ generate imports }
|
{ generate imports }
|
||||||
if current_module.ImportLibraryList.Count>0 then
|
if current_module.ImportLibraryList.Count>0 then
|
||||||
|
25
tests/webtbs/tw18610.pp
Normal file
25
tests/webtbs/tw18610.pp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
program tw18610;
|
||||||
|
|
||||||
|
{$mode delphi}{$H+}
|
||||||
|
|
||||||
|
type
|
||||||
|
IInt = interface
|
||||||
|
procedure Test;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TParent = class
|
||||||
|
private
|
||||||
|
type
|
||||||
|
TChild = class(TInterfacedObject, IInt)
|
||||||
|
public
|
||||||
|
procedure Test;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TParent.TChild.Test;
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
begin
|
||||||
|
end.
|
Loading…
Reference in New Issue
Block a user