From cea50f71854c139f9adeaca104ac3de11c1956a0 Mon Sep 17 00:00:00 2001 From: peter <peter@freepascal.org> Date: Mon, 16 Sep 2002 14:11:12 +0000 Subject: [PATCH] * add argument to equal_paras() to support default values or not --- compiler/defbase.pas | 20 +++++++++++++------- compiler/ncal.pas | 7 +++++-- compiler/ncnv.pas | 17 +++++++++++++---- compiler/nobj.pas | 17 ++++++++++------- compiler/pdecobj.pas | 9 ++++++--- compiler/pdecsub.pas | 9 ++++++--- compiler/symsym.pas | 33 +++++++++++++++++++-------------- 7 files changed, 72 insertions(+), 40 deletions(-) diff --git a/compiler/defbase.pas b/compiler/defbase.pas index 66bdd321d9..16d137e311 100644 --- a/compiler/defbase.pas +++ b/compiler/defbase.pas @@ -239,7 +239,7 @@ interface and call by const parameter are assumed as equal } - function equal_paras(paralist1,paralist2 : tlinkedlist; acp : compare_type) : boolean; + function equal_paras(paralist1,paralist2 : TLinkedList; acp : compare_type;allowdefaults:boolean) : boolean; { True if a type can be allowed for another one @@ -333,7 +333,7 @@ implementation { compare_type = ( cp_none, cp_value_equal_const, cp_all); } - function equal_paras(paralist1,paralist2 : TLinkedList; acp : compare_type) : boolean; + function equal_paras(paralist1,paralist2 : TLinkedList; acp : compare_type;allowdefaults:boolean) : boolean; var def1,def2 : TParaItem; begin @@ -389,13 +389,16 @@ implementation { when both lists are empty then the parameters are equal. Also when one list is empty and the other has a parameter with default value assigned then the parameters are also equal } - if ((def1=nil) and ((def2=nil) or assigned(def2.defaultvalue))) or - ((def2=nil) and ((def1=nil) or assigned(def1.defaultvalue))) then + if ((def1=nil) and (def2=nil)) or + (allowdefaults and + ((assigned(def1) and assigned(def1.defaultvalue)) or + (assigned(def2) and assigned(def2.defaultvalue)))) then equal_paras:=true else equal_paras:=false; end; + function convertable_paras(paralist1,paralist2 : TLinkedList;acp : compare_type) : boolean; var def1,def2 : TParaItem; @@ -479,7 +482,7 @@ implementation { check return value and para's and options, methodpointer is already checked parameters may also be convertable } if is_equal(def1.rettype.def,def2.rettype.def) and - (equal_paras(def1.para,def2.para,cp_all) or + (equal_paras(def1.para,def2.para,cp_all,false) or ((not exact) and convertable_paras(def1.para,def2.para,cp_all))) and ((po_comp * def1.procoptions)= (po_comp * def2.procoptions)) then proc_to_procvar_equal:=true @@ -1132,7 +1135,7 @@ implementation ((tprocvardef(def1).procoptions * po_compatibility_options)= (tprocvardef(def2).procoptions * po_compatibility_options)) and is_equal(tprocvardef(def1).rettype.def,tprocvardef(def2).rettype.def) and - equal_paras(tprocvardef(def1).para,tprocvardef(def2).para,cp_all); + equal_paras(tprocvardef(def1).para,tprocvardef(def2).para,cp_all,false); end else if (def1.deftype=arraydef) and (def2.deftype=arraydef) then @@ -1953,7 +1956,10 @@ implementation end. { $Log$ - Revision 1.11 2002-09-15 17:54:46 peter + Revision 1.12 2002-09-16 14:11:12 peter + * add argument to equal_paras() to support default values or not + + Revision 1.11 2002/09/15 17:54:46 peter * allow default parameters in equal_paras Revision 1.10 2002/09/08 11:10:17 carl diff --git a/compiler/ncal.pas b/compiler/ncal.pas index 9ef844933a..21c42914f8 100644 --- a/compiler/ncal.pas +++ b/compiler/ncal.pas @@ -1603,7 +1603,7 @@ implementation hp:=procs; while assigned(hp) do begin - if equal_paras(hp^.data.para,pd.para,cp_value_equal_const) then + if equal_paras(hp^.data.para,pd.para,cp_value_equal_const,false) then begin found:=true; break; @@ -2604,7 +2604,10 @@ begin end. { $Log$ - Revision 1.100 2002-09-15 17:49:59 peter + Revision 1.101 2002-09-16 14:11:12 peter + * add argument to equal_paras() to support default values or not + + Revision 1.100 2002/09/15 17:49:59 peter * don't have strict var parameter checking for procedures in the system unit diff --git a/compiler/ncnv.pas b/compiler/ncnv.pas index de6a97884c..78972990a1 100644 --- a/compiler/ncnv.pas +++ b/compiler/ncnv.pas @@ -1915,6 +1915,8 @@ implementation function tasnode.det_resulttype:tnode; + var + hp : tnode; begin result:=nil; resulttypepass(right); @@ -1969,8 +1971,12 @@ implementation { load the GUID of the interface } if (right.nodetype=typen) then begin - if tobjectdef(left.resulttype.def).isiidguidvalid then - right:=cguidconstnode.create(tobjectdef(left.resulttype.def).iidguid) + if tobjectdef(right.resulttype.def).isiidguidvalid then + begin + hp:=cguidconstnode.create(tobjectdef(right.resulttype.def).iidguid); + right.free; + right:=hp; + end else internalerror(200206282); resulttypepass(right); @@ -2012,7 +2018,7 @@ implementation else procname := 'fpc_intf_as'; call := ccallnode.createinternres(procname, - ccallparanode.create(left,ccallparanode.create(right,nil)), + ccallparanode.create(right,ccallparanode.create(left,nil)), resulttype); end; left := nil; @@ -2037,7 +2043,10 @@ begin end. { $Log$ - Revision 1.80 2002-09-07 20:40:23 carl + Revision 1.81 2002-09-16 14:11:13 peter + * add argument to equal_paras() to support default values or not + + Revision 1.80 2002/09/07 20:40:23 carl * cardinal -> longword Revision 1.79 2002/09/07 15:25:03 peter diff --git a/compiler/nobj.pas b/compiler/nobj.pas index c0c3997164..dc1e37ca51 100644 --- a/compiler/nobj.pas +++ b/compiler/nobj.pas @@ -605,7 +605,7 @@ implementation if not(po_virtualmethod in pd.procoptions) then begin if (not pdoverload or - equal_paras(procdefcoll^.data.para,pd.para,cp_value_equal_const)) and + equal_paras(procdefcoll^.data.para,pd.para,cp_value_equal_const,false)) and (tstoredsym(procdefcoll^.data.procsym).is_visible_for_object(pd._class)) then begin if is_visible then @@ -624,7 +624,7 @@ implementation begin { we start a new virtual tree, hide the old } if (not pdoverload or - equal_paras(procdefcoll^.data.para,pd.para,cp_value_equal_const)) and + equal_paras(procdefcoll^.data.para,pd.para,cp_value_equal_const,false)) and (tstoredsym(procdefcoll^.data.procsym).is_visible_for_object(pd._class)) then begin if is_visible then @@ -640,7 +640,7 @@ implementation { do nothing, the error will follow when adding the entry } end { same parameters } - else if (equal_paras(procdefcoll^.data.para,pd.para,cp_value_equal_const)) then + else if (equal_paras(procdefcoll^.data.para,pd.para,cp_value_equal_const,false)) then begin { overload is inherited } if (po_overload in procdefcoll^.data.procoptions) then @@ -694,7 +694,7 @@ implementation if the new defintion has not the overload directive } if is_visible and ((not pdoverload) or - equal_paras(procdefcoll^.data.para,pd.para,cp_value_equal_const)) then + equal_paras(procdefcoll^.data.para,pd.para,cp_value_equal_const,false)) then procdefcoll^.hidden:=true; end; end @@ -704,7 +704,7 @@ implementation has not the overload directive } if is_visible and ((not pdoverload) or - equal_paras(procdefcoll^.data.para,pd.para,cp_value_equal_const)) then + equal_paras(procdefcoll^.data.para,pd.para,cp_value_equal_const,false)) then procdefcoll^.hidden:=true; end; end; { not hidden } @@ -1002,7 +1002,7 @@ implementation for i:=1 to sym.procdef_count do begin implprocdef:=sym.procdef[i]; - if equal_paras(proc.para,implprocdef.para,cp_none) and + if equal_paras(proc.para,implprocdef.para,cp_none,false) and (proc.proccalloption=implprocdef.proccalloption) then begin gintfgetcprocdef:=implprocdef; @@ -1301,7 +1301,10 @@ initialization end. { $Log$ - Revision 1.27 2002-09-03 16:26:26 daniel + Revision 1.28 2002-09-16 14:11:13 peter + * add argument to equal_paras() to support default values or not + + Revision 1.27 2002/09/03 16:26:26 daniel * Make Tprocdef.defs protected Revision 1.26 2002/09/03 15:44:44 peter diff --git a/compiler/pdecobj.pas b/compiler/pdecobj.pas index 05f0b2203d..12c0dedbff 100644 --- a/compiler/pdecobj.pas +++ b/compiler/pdecobj.pas @@ -388,7 +388,7 @@ implementation case sym.typ of procsym : begin - pd:=Tprocsym(sym).search_procdef_bypara(propertyparas,true); + pd:=Tprocsym(sym).search_procdef_bypara(propertyparas,true,false); if not(assigned(pd)) or not(is_equal(pd.rettype.def,p.proptype.def)) then Message(parser_e_ill_property_access_sym); @@ -423,7 +423,7 @@ implementation begin { insert data entry to check access method } propertyparas.insert(datacoll); - pd:=Tprocsym(sym).search_procdef_bypara(propertyparas,true); + pd:=Tprocsym(sym).search_procdef_bypara(propertyparas,true,false); { ... and remove it } propertyparas.remove(datacoll); if not(assigned(pd)) then @@ -1150,7 +1150,10 @@ implementation end. { $Log$ - Revision 1.51 2002-09-09 17:34:15 peter + Revision 1.52 2002-09-16 14:11:13 peter + * add argument to equal_paras() to support default values or not + + Revision 1.51 2002/09/09 17:34:15 peter * tdicationary.replace added to replace and item in a dictionary. This is only allowed for the same name * varsyms are inserted in symtable before the types are parsed. This diff --git a/compiler/pdecsub.pas b/compiler/pdecsub.pas index c7268a6c38..65a4e42888 100644 --- a/compiler/pdecsub.pas +++ b/compiler/pdecsub.pas @@ -1769,7 +1769,7 @@ const ) or { check arguments } ( - equal_paras(aprocdef.para,hd.para,cp_none) and + equal_paras(aprocdef.para,hd.para,cp_none,false) and { for operators equal_paras is not enough !! } ((aprocdef.proctypeoption<>potype_operator) or (optoken<>_ASSIGNMENT) or is_equal(hd.rettype.def,aprocdef.rettype.def)) @@ -1788,7 +1788,7 @@ const ( (m_repeat_forward in aktmodeswitches) and (not((aprocdef.maxparacount=0) or - equal_paras(aprocdef.para,hd.para,cp_all))) + equal_paras(aprocdef.para,hd.para,cp_all,false))) ) or ( ((m_repeat_forward in aktmodeswitches) or @@ -1989,7 +1989,10 @@ const end. { $Log$ - Revision 1.74 2002-09-10 16:27:28 peter + Revision 1.75 2002-09-16 14:11:13 peter + * add argument to equal_paras() to support default values or not + + Revision 1.74 2002/09/10 16:27:28 peter * don't insert parast in symtablestack, because typesyms should not be searched in the the parast diff --git a/compiler/symsym.pas b/compiler/symsym.pas index d31c58846c..154bb6397f 100644 --- a/compiler/symsym.pas +++ b/compiler/symsym.pas @@ -139,7 +139,8 @@ interface function search_procdef_nopara_boolret:Tprocdef; function search_procdef_bytype(pt:Tproctypeoption):Tprocdef; function search_procdef_bypara(params:Tparalinkedlist; - allowconvert:boolean):Tprocdef; + allowconvert, + allowdefault:boolean):Tprocdef; function search_procdef_byprocvardef(d:Tprocvardef):Tprocdef; function search_procdef_by1paradef(firstpara:Tdef):Tprocdef; function search_procdef_byretdef_by1paradef(retdef,firstpara:Tdef; @@ -915,18 +916,18 @@ implementation procedure Tprocsym.add_para_match_to(Aprocsym:Tprocsym); - - var pd:Pprocdeflist; - - begin + var + pd:Pprocdeflist; + begin pd:=defs; while assigned(pd) do - begin - if Aprocsym.search_procdef_bypara(pd^.def.para,false)=nil then - Aprocsym.addprocdef(pd^.def); - pd:=pd^.next; - end; - end; + begin + if Aprocsym.search_procdef_bypara(pd^.def.para,false,true)=nil then + Aprocsym.addprocdef(pd^.def); + pd:=pd^.next; + end; + end; + procedure Tprocsym.concat_procdefs_to(s:Tprocsym); @@ -1010,7 +1011,8 @@ implementation end; function Tprocsym.search_procdef_bypara(params:Tparalinkedlist; - allowconvert:boolean):Tprocdef; + allowconvert, + allowdefault:boolean):Tprocdef; var pd:Pprocdeflist; @@ -1019,7 +1021,7 @@ implementation pd:=defs; while assigned(pd) do begin - if equal_paras(pd^.def.para,params,cp_value_equal_const) or + if equal_paras(pd^.def.para,params,cp_value_equal_const,allowdefault) or (allowconvert and convertable_paras(pd^.def.para,params, cp_value_equal_const)) then begin @@ -2495,7 +2497,10 @@ implementation end. { $Log$ - Revision 1.65 2002-09-09 17:34:16 peter + Revision 1.66 2002-09-16 14:11:13 peter + * add argument to equal_paras() to support default values or not + + Revision 1.65 2002/09/09 17:34:16 peter * tdicationary.replace added to replace and item in a dictionary. This is only allowed for the same name * varsyms are inserted in symtable before the types are parsed. This