Before the main course, I offer the attached refactorings for trecorddef.create_global_internal: 1) streamline insertions into the symtable; 2) avoid shadow-copying of the parameter "n", which is now const
-- βþ
# HG changeset patch # User Blaise # Date 1564833600 -10800 # Sat Aug 03 15:00:00 2019 +0300 # Node ID 2873de0e4992db706b03f52c007f6ef7b39f5f8a # Parent b7e97cefc21b2ffdfb22c37abb9bbae8f8a8e7cc = trecorddef.create_global_internal: streamline insertions into the symtable diff -r b7e97cefc21b -r 2873de0e4992 symdef.pas --- a/symdef.pas Fri Aug 02 19:35:25 2019 +0300 +++ b/symdef.pas Sat Aug 03 15:00:00 2019 +0300 @@ -4786,6 +4786,7 @@ constructor trecorddef.create_global_internal(n: string; packrecords, recordalignmin: shortint); var oldsymtablestack: tsymtablestack; + where: tsymtable; ts: ttypesym; definedname: boolean; begin @@ -4802,27 +4803,19 @@ symtable.defowner:=self; isunion:=false; inherited create(n,recorddef,true); + where:=current_module.localsymtable; + if not assigned(where) then + where:=current_module.globalsymtable; + where.insertdef(self); { if we specified a name, then we'll probably want to look up the type again by name too -> create typesym } - ts:=nil; if definedname then begin ts:=ctypesym.create(n,self,true); { avoid hints about unused types (these may only be used for typed constant data) } ts.increfcount; - end; - if assigned(current_module.localsymtable) then - begin - current_module.localsymtable.insertdef(self); - if definedname then - current_module.localsymtable.insert(ts); - end - else - begin - current_module.globalsymtable.insertdef(self); - if definedname then - current_module.globalsymtable.insert(ts); + where.insert(ts); end; symtablestack:=oldsymtablestack; { don't create RTTI for internal types, these are not exported }
# HG changeset patch # User Blaise # Date 1564838933 -10800 # Sat Aug 03 16:28:53 2019 +0300 # Node ID 49cbbb22f46dc471223290b1b24f312f24d65e76 # Parent 2873de0e4992db706b03f52c007f6ef7b39f5f8a = trecorddef.create_global_internal: avoid shadow-copying of the parameter "n", which is now const diff -r 2873de0e4992 -r 49cbbb22f46d symdef.pas --- a/symdef.pas Sat Aug 03 15:00:00 2019 +0300 +++ b/symdef.pas Sat Aug 03 16:28:53 2019 +0300 @@ -374,7 +374,7 @@ variantrecdesc : pvariantrecdesc; isunion : boolean; constructor create(const n:string; p:TSymtable);virtual; - constructor create_global_internal(n: string; packrecords, recordalignmin: shortint); virtual; + constructor create_global_internal(const n: string; packrecords, recordalignmin: shortint); virtual; function add_field_by_def(const optionalname: TIDString; def: tdef): tsym; procedure add_fields_from_deflist(fieldtypes: tfplist); constructor ppuload(ppufile:tcompilerppufile); @@ -4783,33 +4783,37 @@ end; - constructor trecorddef.create_global_internal(n: string; packrecords, recordalignmin: shortint); + constructor trecorddef.create_global_internal(const n: string; packrecords, recordalignmin: shortint); var + name: string; pname: pshortstring; oldsymtablestack: tsymtablestack; where: tsymtable; ts: ttypesym; - definedname: boolean; begin { construct name } - definedname:=n<>''; - if not definedname then - n:='$InternalRec'+tostr(current_module.deflist.count); + if n<>'' then + pname := @n + else + begin + name:='$InternalRec'+tostr(current_module.deflist.count); + pname:=@name; + end; oldsymtablestack:=symtablestack; { do not simply push/pop current_module.localsymtable, because that can have side-effects (e.g., it removes helpers) } symtablestack:=nil; - symtable:=trecordsymtable.create(n,packrecords,recordalignmin); + symtable:=trecordsymtable.create(pname^,packrecords,recordalignmin); symtable.defowner:=self; isunion:=false; - inherited create(n,recorddef,true); + inherited create(pname^,recorddef,true);//! where:=current_module.localsymtable; if not assigned(where) then where:=current_module.globalsymtable; where.insertdef(self); { if we specified a name, then we'll probably want to look up the type again by name too -> create typesym } - if definedname then + if n<>'' then begin ts:=ctypesym.create(n,self,true); { avoid hints about unused types (these may only be used for
_______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel