summaryrefslogtreecommitdiff
path: root/compiler/cgobj.pas
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/cgobj.pas')
-rw-r--r--compiler/cgobj.pas54
1 files changed, 54 insertions, 0 deletions
diff --git a/compiler/cgobj.pas b/compiler/cgobj.pas
index 820927579f..af43bb64e8 100644
--- a/compiler/cgobj.pas
+++ b/compiler/cgobj.pas
@@ -451,6 +451,8 @@ unit cgobj;
procedure g_incrrefcount(list : TAsmList;t: tdef; const ref: treference);
procedure g_decrrefcount(list : TAsmList;t: tdef; const ref: treference);
+ procedure g_array_rtti_helper(list: TAsmList; t: tdef; const ref: treference; const highloc: tlocation;
+ const name: string);
procedure g_initialize(list : TAsmList;t : tdef;const ref : treference);
procedure g_finalize(list : TAsmList;t : tdef;const ref : treference);
@@ -3509,6 +3511,8 @@ implementation
end
else
begin
+ if is_open_array(t) then
+ InternalError(201103054);
reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0,sizeof(pint));
a_loadaddr_ref_cgpara(list,href,cgpara2);
a_loadaddr_ref_cgpara(list,ref,cgpara1);
@@ -3574,6 +3578,8 @@ implementation
end
else
begin
+ if is_open_array(t) then
+ InternalError(201103053);
reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0,sizeof(pint));
a_loadaddr_ref_cgpara(list,href,cgpara2);
a_loadaddr_ref_cgpara(list,ref,cgpara1);
@@ -3587,6 +3593,50 @@ implementation
cgpara1.done;
end;
+ procedure tcg.g_array_rtti_helper(list: TAsmList; t: tdef; const ref: treference; const highloc: tlocation; const name: string);
+ var
+ cgpara1,cgpara2,cgpara3: TCGPara;
+ href: TReference;
+ hreg, lenreg: TRegister;
+ begin
+ cgpara1.init;
+ cgpara2.init;
+ cgpara3.init;
+ paramanager.getintparaloc(pocall_default,1,cgpara1);
+ paramanager.getintparaloc(pocall_default,2,cgpara2);
+ paramanager.getintparaloc(pocall_default,3,cgpara3);
+
+ reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0,sizeof(pint));
+ if highloc.loc=LOC_CONSTANT then
+ a_load_const_cgpara(list,OS_INT,highloc.value+1,cgpara3)
+ else
+ begin
+ if highloc.loc in [LOC_REGISTER,LOC_CREGISTER] then
+ hreg:=highloc.register
+ else
+ begin
+ hreg:=getintregister(list,OS_INT);
+ a_load_loc_reg(list,OS_INT,highloc,hreg);
+ end;
+ { increment, converts high(x) to length(x) }
+ lenreg:=getintregister(list,OS_INT);
+ a_op_const_reg_reg(list,OP_ADD,OS_INT,1,hreg,lenreg);
+ a_load_reg_cgpara(list,OS_INT,lenreg,cgpara3);
+ end;
+
+ a_loadaddr_ref_cgpara(list,href,cgpara2);
+ a_loadaddr_ref_cgpara(list,ref,cgpara1);
+ paramanager.freecgpara(list,cgpara1);
+ paramanager.freecgpara(list,cgpara2);
+ paramanager.freecgpara(list,cgpara3);
+ allocallcpuregisters(list);
+ a_call_name(list,name,false);
+ deallocallcpuregisters(list);
+
+ cgpara3.done;
+ cgpara2.done;
+ cgpara1.done;
+ end;
procedure tcg.g_initialize(list : TAsmList;t : tdef;const ref : treference);
var
@@ -3605,6 +3655,8 @@ implementation
a_load_const_ref(list,OS_ADDR,0,ref)
else
begin
+ if is_open_array(t) then
+ InternalError(201103052);
reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0,sizeof(pint));
a_loadaddr_ref_cgpara(list,href,cgpara2);
a_loadaddr_ref_cgpara(list,ref,cgpara1);
@@ -3638,6 +3690,8 @@ implementation
end
else
begin
+ if is_open_array(t) then
+ InternalError(201103051);
reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0,sizeof(pint));
a_loadaddr_ref_cgpara(list,href,cgpara2);
a_loadaddr_ref_cgpara(list,ref,cgpara1);