* also generate wrappers for inherited virtual class methods, because their

visibility can change. However, simply call the inherited version in
    those rather than re-adding the complete dispatching code again

git-svn-id: branches/jvmbackend@18737 -
This commit is contained in:
Jonas Maebe 2011-08-20 08:30:15 +00:00
parent c2f2a8c900
commit a216707cf2

View File

@ -528,11 +528,6 @@ implementation
stringdispose(pd.import_name);
pd.import_name:=stringdup(wrappername+'__fpcvirtualclassmethod__');
{ we only have to generate the dispatching routine for non-overriding
methods; the overriding ones can use the original one }
if po_overridingmethod in pd.procoptions then
exit;
{ wrapper is part of the same symtable as the original procdef }
symtablestack.push(pd.owner);
{ get a copy of the virtual class method }
@ -544,12 +539,26 @@ implementation
stringdispose(wrapperpd.import_name);
wrapperpd.import_name:=stringdup(wrappername);
include(wrapperpd.procoptions,po_has_importname);
{ implementation }
wrapperpd.synthetickind:=tsk_jvm_virtual_clmethod;
{ associate with wrapper procsym (Pascal-level name = wrapper name ->
in callnodes, we will have to replace the calls to virtual class
methods with calls to the wrappers) }
finish_copied_procdef(wrapperpd,pd.import_name^,pd.owner,tabstractrecorddef(pd.owner.defowner));
{ we only have to generate the dispatching routine for non-overriding
methods; the overriding ones can use the original one, but generate
a skeleton for that anyway because the overriding one may still
change the visibility (but we can just call the inherited routine
in that case) }
if po_overridingmethod in pd.procoptions then
begin
wrapperpd.synthetickind:=tsk_anon_inherited;
symtablestack.pop(pd.owner);
exit;
end;
{ implementation }
wrapperpd.synthetickind:=tsk_jvm_virtual_clmethod;
wrapperpd.skpara:=pd;
{ also create procvar type that we can use in the implementation }
wrapperpv:=tprocvardef(pd.getcopyas(procvardef,pc_normal));
wrapperpv.calcparas;
@ -559,7 +568,6 @@ implementation
typ:=ttypesym.create('__fpc_virtualclassmethod_pv_t'+tostr(wrapperpd.defid),wrapperpv);
wrapperpv.classdef.typesym.visibility:=vis_strictprivate;
symtablestack.top.insert(typ);
wrapperpd.skpara:=pd;
symtablestack.pop(pd.owner);
end;