* make the real name of methods implementing interface methods the same as

as the real name of the declaration in the interface, so that the JVM
    case-sensitive mapping works out
  * process the interface mappings for the compiler-constructed classes for
    enums and procvars

git-svn-id: branches/jvmbackend@18693 -
This commit is contained in:
Jonas Maebe 2011-08-20 08:25:14 +00:00
parent 4557938e62
commit 7e7bdc3c55
2 changed files with 22 additions and 2 deletions

View File

@ -573,7 +573,15 @@ implementation
if assigned(implprocdef) then
begin
if (tobjectdef(implprocdef.struct).objecttype<>odt_objcclass) then
ImplIntf.AddImplProc(implprocdef)
begin
{ in case of Java, copy the real name from the parent,
since overriding "Destroy" with "destroy" is not
going to work very well }
if is_javaclass(implprocdef.struct) and
(implprocdef.procsym.realname<>tprocdef(def).procsym.realname) then
implprocdef.procsym.realname:=tprocdef(def).procsym.realname;
ImplIntf.AddImplProc(implprocdef);
end
else
begin
{ If no message name has been specified for the method

View File

@ -55,7 +55,7 @@ implementation
fmodule,
parabase,aasmdata,
pdecsub,ngenutil,pparautl,
symtable,symcreat,defcmp,jvmdef,
symtable,symcreat,defcmp,jvmdef,nobj,
defutil,paramgr;
@ -241,6 +241,7 @@ implementation
procedure jvm_maybe_create_enum_class(const name: TIDString; def: tdef);
var
vmtbuilder: tvmtbuilder;
arrdef: tarraydef;
arrsym: ttypesym;
juhashmap: tdef;
@ -415,6 +416,11 @@ implementation
pd.synthetickind:=tsk_jvm_enum_classconstr;
symtablestack.pop(enumclass.symtable);
vmtbuilder:=TVMTBuilder.Create(enumclass);
vmtbuilder.generate_vmt;
vmtbuilder.free;
restore_after_new_class(sstate,islocal,oldsymtablestack);
current_structdef:=old_current_structdef;
end;
@ -422,6 +428,7 @@ implementation
procedure jvm_create_procvar_class(const name: TIDString; def: tdef);
var
vmtbuilder: tvmtbuilder;
oldsymtablestack: tsymtablestack;
pvclass: tobjectdef;
temptypesym: ttypesym;
@ -473,6 +480,11 @@ implementation
pvclass.symtable.insert(temptypesym);
symtablestack.pop(pvclass.symtable);
vmtbuilder:=TVMTBuilder.Create(pvclass);
vmtbuilder.generate_vmt;
vmtbuilder.free;
restore_after_new_class(sstate,islocal,oldsymtablestack);
end;