* separated JVM-specific subscripting code in virtual method

git-svn-id: branches/hlcgllvm@26030 -
This commit is contained in:
Jonas Maebe 2013-11-11 11:14:47 +00:00
parent 9e6764e443
commit b47cc22d66
2 changed files with 38 additions and 9 deletions

View File

@ -46,6 +46,11 @@ interface
procedure pass_generate_code; override;
end;
tjvmsubscriptnode = class(tcgsubscriptnode)
protected
function handle_platform_subscript: boolean; override;
end;
tjvmloadvmtaddrnode = class(tcgloadvmtaddrnode)
procedure pass_generate_code; override;
end;
@ -123,6 +128,27 @@ implementation
end
end;
{*****************************************************************************
TJVMSUBSCRIPTNODE
*****************************************************************************}
function tjvmsubscriptnode.handle_platform_subscript: boolean;
begin
result:=false;
if is_java_class_or_interface(left.resultdef) or
(left.resultdef.typ=recorddef) then
begin
if (location.loc<>LOC_REFERENCE) or
(location.reference.index<>NR_NO) or
assigned(location.reference.symbol) then
internalerror(2011011301);
location.reference.symbol:=current_asmdata.RefAsmSymbol(vs.mangledname);
result:=true;
end
end;
{*****************************************************************************
TJVMADDRNODE
*****************************************************************************}
@ -471,6 +497,7 @@ implementation
begin
cderefnode:=tjvmderefnode;
csubscriptnode:=tjvmsubscriptnode;
caddrnode:=tjvmaddrnode;
cvecnode:=tjvmvecnode;
cloadvmtaddrnode:=tjvmloadvmtaddrnode;

View File

@ -48,6 +48,9 @@ interface
end;
tcgsubscriptnode = class(tsubscriptnode)
protected
function handle_platform_subscript: boolean; virtual;
public
procedure pass_generate_code;override;
end;
@ -313,6 +316,11 @@ implementation
TCGSUBSCRIPTNODE
*****************************************************************************}
function tcgsubscriptnode.handle_platform_subscript: boolean;
begin
result:=false;
end;
procedure tcgsubscriptnode.pass_generate_code;
var
sym: tasmsymbol;
@ -359,7 +367,7 @@ implementation
LOC_SUBSETREF,
LOC_CSUBSETREF:
begin
location.reference.base:=cg.getaddressregister(current_asmdata.CurrAsmList);
location.reference.base:=hlcg.getaddressregister(current_asmdata.CurrAsmList,left.resultdef);
hlcg.a_load_loc_reg(current_asmdata.CurrAsmList,left.resultdef,left.resultdef,left.location,location.reference.base);
end;
LOC_CONSTANT:
@ -511,15 +519,9 @@ implementation
{ always packrecords C -> natural alignment }
location.reference.alignment:=vs.vardef.alignment;
end
else if is_java_class_or_interface(left.resultdef) or
((target_info.system in systems_jvm) and
(left.resultdef.typ=recorddef)) then
else if handle_platform_subscript then
begin
if (location.loc<>LOC_REFERENCE) or
(location.reference.index<>NR_NO) or
assigned(location.reference.symbol) then
internalerror(2011011301);
location.reference.symbol:=current_asmdata.RefAsmSymbol(vs.mangledname);
{ done }
end
else if (location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
begin