diff --git a/compiler/jvm/symcpu.pas b/compiler/jvm/symcpu.pas index 0d24168397..113f36c878 100644 --- a/compiler/jvm/symcpu.pas +++ b/compiler/jvm/symcpu.pas @@ -26,6 +26,7 @@ unit symcpu; interface uses + globtype, symdef,symsym; type @@ -104,6 +105,8 @@ type end; tcpufieldvarsym = class(tfieldvarsym) + procedure set_externalname(const s: string); override; + function mangledname: TSymStr; override; end; tcpulocalvarsym = class(tlocalvarsym) @@ -113,6 +116,8 @@ type end; tcpustaticvarsym = class(tstaticvarsym) + procedure set_mangledname(const s: TSymStr); override; + function mangledname: TSymStr; override; end; tcpuabsolutevarsym = class(tabsolutevarsym) @@ -133,6 +138,73 @@ type implementation + uses + verbose,cutils, + symtype,symconst, + jvmdef; + +{**************************************************************************** + tcpustaticvarsym +****************************************************************************} + + procedure tcpustaticvarsym.set_mangledname(const s: TSymStr); + begin + inherited; + _mangledname:=jvmmangledbasename(self,s,false); + jvmaddtypeownerprefix(owner,_mangledname); + end; + + + function tcpustaticvarsym.mangledname: TSymStr; + begin + if _mangledname='' then + begin + if _mangledbasename='' then + _mangledname:=jvmmangledbasename(self,false) + else + _mangledname:=jvmmangledbasename(self,_mangledbasename,false); + jvmaddtypeownerprefix(owner,_mangledname); + end; + result:=_mangledname; + end; + + +{**************************************************************************** + tcpufieldvarsym +****************************************************************************} + + procedure tcpufieldvarsym.set_externalname(const s: string); + begin + { make sure it is recalculated } + cachedmangledname:=''; + if is_java_class_or_interface(tdef(owner.defowner)) then + begin + externalname:=stringdup(s); + include(varoptions,vo_has_mangledname); + end + else + internalerror(2011031201); + end; + + + function tcpufieldvarsym.mangledname: TSymStr; + begin + if is_java_class_or_interface(tdef(owner.defowner)) or + (tdef(owner.defowner).typ=recorddef) then + begin + if cachedmangledname<>'' then + result:=cachedmangledname + else + begin + result:=jvmmangledbasename(self,false); + jvmaddtypeownerprefix(owner,result); + cachedmangledname:=result; + end; + end + else + result:=inherited; + end; + begin { used tdef classes } cfiledef:=tcpufiledef; diff --git a/compiler/symsym.pas b/compiler/symsym.pas index f068fde62d..16335f71de 100644 --- a/compiler/symsym.pas +++ b/compiler/symsym.pas @@ -203,7 +203,7 @@ interface { do not override this routine in platform-specific subclasses, override ppuwrite_platform instead } procedure ppuwrite(ppufile:tcompilerppufile);override;final; - procedure set_externalname(const s:string); + procedure set_externalname(const s:string);virtual; function mangledname:TSymStr;override; destructor destroy;override; end; @@ -258,7 +258,7 @@ interface tparavarsymclass = class of tparavarsym; tstaticvarsym = class(tabstractnormalvarsym) - private + protected {$ifdef symansistr} _mangledbasename, _mangledname : TSymStr; @@ -283,7 +283,7 @@ interface function mangledname:TSymStr;override; procedure set_mangledbasename(const s: TSymStr); function mangledbasename: TSymStr; - procedure set_mangledname(const s:TSymStr); + procedure set_mangledname(const s:TSymStr);virtual; procedure set_raw_mangledname(const s:TSymStr); end; tstaticvarsymclass = class of tstaticvarsym; @@ -453,9 +453,6 @@ implementation systems, { symtable } defutil,symtable, -{$ifdef jvm} - jvmdef, -{$endif} fmodule, { tree } node, @@ -1671,21 +1668,7 @@ implementation procedure tfieldvarsym.set_externalname(const s: string); begin - { make sure it is recalculated } -{$ifdef symansistr} - cachedmangledname:=''; -{$else symansistr} - stringdispose(cachedmangledname); -{$endif symansistr} -{$ifdef jvm} - if is_java_class_or_interface(tdef(owner.defowner)) then - begin - externalname:=stringdup(s); - include(varoptions,vo_has_mangledname); - end - else -{$endif jvm} - internalerror(2011031201); + internalerror(2014033001); end; @@ -1694,21 +1677,6 @@ implementation srsym : tsym; srsymtable : tsymtable; begin -{$ifdef jvm} - if is_java_class_or_interface(tdef(owner.defowner)) or - (tdef(owner.defowner).typ=recorddef) then - begin - if cachedmangledname<>'' then - result:=cachedmangledname - else - begin - result:=jvmmangledbasename(self,false); - jvmaddtypeownerprefix(owner,result); - cachedmangledname:=result; - end; - end - else -{$endif jvm} if sp_static in symoptions then begin if searchsym(lower(owner.name^)+'_'+name,srsym,srsymtable) then @@ -1903,11 +1871,9 @@ implementation function tstaticvarsym.mangledname:TSymStr; -{$ifndef jvm} var usename, prefix : TSymStr; -{$endif jvm} begin {$ifdef symansistr} if _mangledname='' then @@ -1915,31 +1881,23 @@ implementation if not assigned(_mangledname) then {$endif symansistr} begin -{$ifdef jvm} - if _mangledbasename='' then - _mangledname:=jvmmangledbasename(self,false) - else - _mangledname:=jvmmangledbasename(self,_mangledbasename,false); - jvmaddtypeownerprefix(owner,_mangledname); -{$else jvm} if (vo_is_typed_const in varoptions) then prefix:='TC' else prefix:='U'; - {$ifdef symansistr} +{$ifdef symansistr} if _mangledbasename='' then usename:=name else usename:=_mangledbasename; _mangledname:=make_mangledname(prefix,owner,usename); - {$else symansistr} +{$else symansistr} if not assigned(_mangledbasename) then usename:=name else usename:=_mangledbasename^; _mangledname:=stringdup(make_mangledname(prefix,owner,usename)); - {$endif symansistr} -{$endif jvm} +{$endif symansistr} end; {$ifdef symansistr} result:=_mangledname; @@ -1978,19 +1936,12 @@ implementation procedure tstaticvarsym.set_mangledname(const s:TSymStr); begin -{$ifndef symansistr} - stringdispose(_mangledname); -{$endif} -{$if defined(jvm)} - _mangledname:=jvmmangledbasename(self,s,false); - jvmaddtypeownerprefix(owner,_mangledname); -{$else} - {$ifdef symansistr} +{$ifdef symansistr} _mangledname:=s; - {$else symansistr} +{$else symansistr} + stringdispose(_mangledname); _mangledname:=stringdup(s); - {$endif symansistr} -{$endif} +{$endif symansistr} include(varoptions,vo_has_mangledname); end;