From e07933212b15b29dfc28efa79780df71d3118ad1 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Mon, 6 Oct 2014 20:54:12 +0000 Subject: [PATCH] * factored out emitting a guid const git-svn-id: branches/hlcgllvm@28773 - --- compiler/aasmcnst.pas | 24 ++++++++++++++++++++++++ compiler/ngtcon.pas | 33 ++------------------------------- 2 files changed, 26 insertions(+), 31 deletions(-) diff --git a/compiler/aasmcnst.pas b/compiler/aasmcnst.pas index a2d1a92a49..4a127a72eb 100644 --- a/compiler/aasmcnst.pas +++ b/compiler/aasmcnst.pas @@ -228,6 +228,8 @@ type class function emit_unicodestring_const(list: TAsmList; data: pointer; encoding: tstringencoding; winlike: boolean):tasmlabofs; { emit a shortstring constant, and return its def } function emit_shortstring_const(const str: shortstring): tdef; + { emit a guid constant } + procedure emit_guid_const(const guid: tguid); { begin a potential aggregate type. Must be called for any type that consists of multiple tai constant data entries, or that @@ -1027,6 +1029,28 @@ implementation end; + procedure ttai_typedconstbuilder.emit_guid_const(const guid: tguid); + var + i: longint; + begin + maybe_begin_aggregate(rec_tguid); + { variant record -> must specify which fields get initialised } + next_field:=tfieldvarsym(rec_tguid.symtable.symlist[0]); + emit_tai(Tai_const.Create_32bit(longint(guid.D1)),u32inttype); + next_field:=tfieldvarsym(rec_tguid.symtable.symlist[1]); + emit_tai(Tai_const.Create_16bit(guid.D2),u16inttype); + next_field:=tfieldvarsym(rec_tguid.symtable.symlist[2]); + emit_tai(Tai_const.Create_16bit(guid.D3),u16inttype); + next_field:=tfieldvarsym(rec_tguid.symtable.symlist[3]); + { the array } + maybe_begin_aggregate(tfieldvarsym(rec_tguid.symtable.symlist[3]).vardef); + for i:=Low(guid.D4) to High(guid.D4) do + emit_tai(Tai_const.Create_8bit(guid.D4[i]),u8inttype); + maybe_end_aggregate(tfieldvarsym(rec_tguid.symtable.symlist[3]).vardef); + maybe_end_aggregate(rec_tguid); + end; + + procedure ttai_typedconstbuilder.maybe_begin_aggregate(def: tdef); begin begin_aggregate_internal(def,false); diff --git a/compiler/ngtcon.pas b/compiler/ngtcon.pas index a10407878f..1d9c8aa3f3 100644 --- a/compiler/ngtcon.pas +++ b/compiler/ngtcon.pas @@ -1415,25 +1415,10 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis startoffset: aint; procedure handle_stringconstn; - var - i : longint; begin hs:=strpas(tstringconstnode(n).value_str); if string2guid(hs,tmpguid) then - begin - ftcb.maybe_begin_aggregate(rec_tguid); - { variant record -> must specify which fields get initialised } - ftcb.next_field:=tfieldvarsym(rec_tguid.symtable.symlist[0]); - ftcb.emit_tai(Tai_const.Create_32bit(longint(tmpguid.D1)),u32inttype); - ftcb.next_field:=tfieldvarsym(rec_tguid.symtable.symlist[1]); - ftcb.emit_tai(Tai_const.Create_16bit(tmpguid.D2),u16inttype); - ftcb.next_field:=tfieldvarsym(rec_tguid.symtable.symlist[2]); - ftcb.emit_tai(Tai_const.Create_16bit(tmpguid.D3),u16inttype); - ftcb.next_field:=tfieldvarsym(rec_tguid.symtable.symlist[3]); - for i:=Low(tmpguid.D4) to High(tmpguid.D4) do - ftcb.emit_tai(Tai_const.Create_8bit(tmpguid.D4[i]),u8inttype); - ftcb.maybe_end_aggregate(rec_tguid); - end + ftcb.emit_guid_const(tmpguid) else Message(parser_e_improper_guid_syntax); end; @@ -1452,21 +1437,7 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis begin inserttypeconv(n,rec_tguid); if n.nodetype=guidconstn then - begin - ftcb.maybe_begin_aggregate(rec_tguid); - tmpguid:=tguidconstnode(n).value; - { variant record -> must specify which fields get initialised } - ftcb.next_field:=tfieldvarsym(rec_tguid.symtable.symlist[0]); - ftcb.emit_tai(Tai_const.Create_32bit(longint(tmpguid.D1)),u32inttype); - ftcb.next_field:=tfieldvarsym(rec_tguid.symtable.symlist[1]); - ftcb.emit_tai(Tai_const.Create_16bit(tmpguid.D2),u16inttype); - ftcb.next_field:=tfieldvarsym(rec_tguid.symtable.symlist[2]); - ftcb.emit_tai(Tai_const.Create_16bit(tmpguid.D3),u16inttype); - ftcb.next_field:=tfieldvarsym(rec_tguid.symtable.symlist[3]); - for i:=Low(tmpguid.D4) to High(tmpguid.D4) do - ftcb.emit_tai(Tai_const.Create_8bit(tmpguid.D4[i]),u8inttype); - ftcb.maybe_end_aggregate(rec_tguid); - end + ftcb.emit_guid_const(tguidconstnode(n).value) else Message(parser_e_illegal_expression); end;