+ some stuff for the new hidden parameter handling added

This commit is contained in:
florian 2002-12-15 22:50:00 +00:00
parent ad7e970e39
commit c7ca2ff901
2 changed files with 128 additions and 38 deletions

View File

@ -262,7 +262,7 @@ type
< 0 when bestpd is better than currpd
= 0 when both are equal
Too choose the best candidate we use the following order:
To choose the best candidate we use the following order:
- Incompatible flag
- (Smaller) Number of convertlevel 2 parameters (needs less).
- (Smaller) Number of convertlevel 1 parameters.
@ -447,7 +447,9 @@ type
begin
inherited create(callparan,expr,next);
{$ifndef VS_HIDDEN}
hightree:=nil;
{$endif VS_HIDDEN}
if assigned(expr) then
expr.set_file_line(self);
callparaflags:=[];
@ -456,7 +458,9 @@ type
destructor tcallparanode.destroy;
begin
{$ifndef VS_HIDDEN}
hightree.free;
{$endif VS_HIDDEN}
inherited destroy;
end;
@ -465,7 +469,9 @@ type
begin
inherited ppuload(t,ppufile);
ppufile.getsmallset(callparaflags);
{$ifndef VS_HIDDEN}
hightree:=ppuloadnode(ppufile);
{$endif VS_HIDDEN}
end;
@ -473,15 +479,19 @@ type
begin
inherited ppuwrite(ppufile);
ppufile.putsmallset(callparaflags);
{$ifndef VS_HIDDEN}
ppuwritenode(ppufile,hightree);
{$endif VS_HIDDEN}
end;
procedure tcallparanode.derefimpl;
begin
inherited derefimpl;
{$ifndef VS_HIDDEN}
if assigned(hightree) then
hightree.derefimpl;
{$endif VS_HIDDEN}
end;
@ -493,10 +503,12 @@ type
begin
n:=tcallparanode(inherited getcopy);
n.callparaflags:=callparaflags;
{$ifndef VS_HIDDEN}
if assigned(hightree) then
n.hightree:=hightree.getcopy
else
n.hightree:=nil;
{$endif VS_HIDDEN}
n.paraitem:=paraitem;
result:=n;
end;
@ -541,7 +553,7 @@ type
paraitem:=defcoll;
if not assigned(defcoll) then
if not assigned(paraitem) then
internalerror(200104261);
{$ifdef extdebug}
@ -554,13 +566,12 @@ type
if assigned(right) then
begin
{ if we are a para that belongs to varargs then keep
the current defcoll }
the current paraitem }
if (nf_varargs_para in flags) then
tcallparanode(right).insert_typeconv(defcoll,do_count)
tcallparanode(right).insert_typeconv(paraitem,do_count)
else
tcallparanode(right).insert_typeconv(tparaitem(defcoll.next),do_count);
tcallparanode(right).insert_typeconv(tparaitem(paraitem.next),do_count)
end;
{ Be sure to have the resulttype }
if not assigned(left.resulttype.def) then
resulttypepass(left);
@ -585,13 +596,13 @@ type
it here before the arrayconstructor node breaks the tree
with its conversions of enum->ord }
if (left.nodetype=arrayconstructorn) and
(defcoll.paratype.def.deftype=setdef) then
inserttypeconv(left,defcoll.paratype);
(paraitem.paratype.def.deftype=setdef) then
inserttypeconv(left,paraitem.paratype);
{ set some settings needed for arrayconstructor }
if is_array_constructor(left.resulttype.def) then
begin
if is_array_of_const(defcoll.paratype.def) then
if is_array_of_const(paraitem.paratype.def) then
begin
if assigned(aktcallprocdef) and
(aktcallprocdef.proccalloption in [pocall_cppdecl,pocall_cdecl]) then
@ -604,29 +615,29 @@ type
include(left.flags,nf_novariaallowed);
{ now that the resultting type is know we can insert the required
typeconvs for the array constructor }
tarrayconstructornode(left).force_type(tarraydef(defcoll.paratype.def).elementtype);
tarrayconstructornode(left).force_type(tarraydef(paraitem.paratype.def).elementtype);
end;
end;
{ check if local proc/func is assigned to procvar }
if left.resulttype.def.deftype=procvardef then
test_local_to_procvar(tprocvardef(left.resulttype.def),defcoll.paratype.def);
test_local_to_procvar(tprocvardef(left.resulttype.def),paraitem.paratype.def);
{ generate the high() value tree }
if paramanager.push_high_param(defcoll.paratype.def,aktcallprocdef.proccalloption) then
gen_high_tree(is_open_string(defcoll.paratype.def));
if paramanager.push_high_param(paraitem.paratype.def,aktcallprocdef.proccalloption) then
gen_high_tree(is_open_string(paraitem.paratype.def));
{ test conversions }
if not(is_shortstring(left.resulttype.def) and
is_shortstring(defcoll.paratype.def)) and
(defcoll.paratype.def.deftype<>formaldef) then
is_shortstring(paraitem.paratype.def)) and
(paraitem.paratype.def.deftype<>formaldef) then
begin
{ Process open parameters }
if paramanager.push_high_param(defcoll.paratype.def,aktcallprocdef.proccalloption) then
if paramanager.push_high_param(paraitem.paratype.def,aktcallprocdef.proccalloption) then
begin
{ insert type conv but hold the ranges of the array }
oldtype:=left.resulttype;
inserttypeconv(left,defcoll.paratype);
inserttypeconv(left,paraitem.paratype);
left.resulttype:=oldtype;
end
else
@ -636,7 +647,7 @@ type
if (left.resulttype.def.deftype in [enumdef,orddef,floatdef]) and
(left.nodetype in [vecn,loadn,calln]) then
begin
if (left.resulttype.def.size>defcoll.paratype.def.size) then
if (left.resulttype.def.size>paraitem.paratype.def.size) then
begin
if (cs_check_range in aktlocalswitches) then
Message(type_w_smaller_possible_range_check)
@ -644,7 +655,7 @@ type
Message(type_h_smaller_possible_range_check);
end;
end;
inserttypeconv(left,defcoll.paratype);
inserttypeconv(left,paraitem.paratype);
end;
if codegenerror then
begin
@ -656,17 +667,17 @@ type
{ check var strings }
if (cs_strict_var_strings in aktlocalswitches) and
is_shortstring(left.resulttype.def) and
is_shortstring(defcoll.paratype.def) and
(defcoll.paratyp in [vs_out,vs_var]) and
not(is_open_string(defcoll.paratype.def)) and
not(equal_defs(left.resulttype.def,defcoll.paratype.def)) then
is_shortstring(paraitem.paratype.def) and
(paraitem.paratyp in [vs_out,vs_var]) and
not(is_open_string(paraitem.paratype.def)) and
not(equal_defs(left.resulttype.def,paraitem.paratype.def)) then
begin
aktfilepos:=left.fileinfo;
CGMessage(type_e_strict_var_string_violation);
end;
{ Handle formal parameters separate }
if (defcoll.paratype.def.deftype=formaldef) then
if (paraitem.paratype.def.deftype=formaldef) then
begin
{ load procvar if a procedure is passed }
if (m_tp_procvar in aktmodeswitches) and
@ -674,7 +685,7 @@ type
(is_void(left.resulttype.def)) then
load_procvar_from_calln(left);
case defcoll.paratyp of
case paraitem.paratyp of
vs_var,
vs_out :
begin
@ -691,33 +702,33 @@ type
else
begin
{ check if the argument is allowed }
if (defcoll.paratyp in [vs_out,vs_var]) then
if (paraitem.paratyp in [vs_out,vs_var]) then
valid_for_var(left);
end;
if defcoll.paratyp in [vs_var,vs_const] then
if paraitem.paratyp in [vs_var,vs_const] then
begin
{ Causes problems with const ansistrings if also }
{ done for vs_const (JM) }
if defcoll.paratyp = vs_var then
if paraitem.paratyp = vs_var then
set_unique(left);
make_not_regable(left);
end;
{ ansistrings out paramaters doesn't need to be }
{ unique, they are finalized }
if defcoll.paratyp=vs_out then
if paraitem.paratyp=vs_out then
make_not_regable(left);
if do_count then
begin
{ not completly proper, but avoids some warnings }
if (defcoll.paratyp in [vs_var,vs_out]) then
if (paraitem.paratyp in [vs_var,vs_out]) then
set_funcret_is_valid(left);
set_varstate(left,not(defcoll.paratyp in [vs_var,vs_out]));
set_varstate(left,not(paraitem.paratyp in [vs_var,vs_out]));
end;
{ must only be done after typeconv PM }
resulttype:=defcoll.paratype;
resulttype:=paraitem.paratype;
dec(parsing_para_level);
{$ifdef extdebug}
if do_count then
@ -774,7 +785,71 @@ type
det_registers;
end;
{$ifdef VS_HIDDEN}
procedure tcallparanode.gen_high_tree(openstring:boolean);
var
temp: tnode;
len : integer;
loadconst : boolean;
hightree : tnode;
begin
if assigned(hightree) then
exit;
len:=-1;
loadconst:=true;
case left.resulttype.def.deftype of
arraydef :
begin
{ handle via a normal inline in_high_x node }
loadconst := false;
hightree := geninlinenode(in_high_x,false,left.getcopy);
{ only substract low(array) if it's <> 0 }
temp := geninlinenode(in_low_x,false,left.getcopy);
firstpass(temp);
if (temp.nodetype <> ordconstn) or
(tordconstnode(temp).value <> 0) then
hightree := caddnode.create(subn,hightree,temp)
else
temp.free;
end;
stringdef :
begin
if openstring then
begin
{ handle via a normal inline in_high_x node }
loadconst := false;
hightree := geninlinenode(in_high_x,false,left.getcopy);
end
else
{ passing a string to an array of char }
begin
if (left.nodetype=stringconstn) then
begin
len:=str_length(left);
if len>0 then
dec(len);
end
else
begin
hightree:=caddnode.create(subn,geninlinenode(in_length_x,false,left.getcopy),
cordconstnode.create(1,s32bittype,false));
loadconst:=false;
end;
end;
end;
else
len:=0;
end;
if loadconst then
hightree:=cordconstnode.create(len,s32bittype,true)
else
hightree:=ctypeconvnode.create(hightree,s32bittype);
firstpass(hightree);
temp:=ccallparanode.create(hightree,right);
right:=temp;
end;
{$else VS_HIDDEN}
procedure tcallparanode.gen_high_tree(openstring:boolean);
var
temp: tnode;
@ -834,14 +909,17 @@ type
hightree:=ctypeconvnode.create(hightree,s32bittype);
firstpass(hightree);
end;
{$endif VS_HIDDEN}
function tcallparanode.docompare(p: tnode): boolean;
begin
docompare :=
inherited docompare(p) and
(callparaflags = tcallparanode(p).callparaflags) and
hightree.isequal(tcallparanode(p).hightree);
(callparaflags = tcallparanode(p).callparaflags)
{$ifndef VS_HIDDEN}
and hightree.isequal(tcallparanode(p).hightree)
{$endif VS_HIDDEN}
;
end;
{****************************************************************************
@ -2198,7 +2276,10 @@ begin
end.
{
$Log$
Revision 1.121 2002-12-15 21:34:15 peter
Revision 1.122 2002-12-15 22:50:00 florian
+ some stuff for the new hidden parameter handling added
Revision 1.121 2002/12/15 21:34:15 peter
* give sign difference between ordinals a small penalty. This is
needed to get word->[longword|longint] working

View File

@ -83,6 +83,8 @@ implementation
procedure tcgcallparanode.secondcallparan(push_from_left_to_right:boolean;calloption:tproccalloption;para_alignment,para_offset : longint);
{$ifndef VS_HIDDEN}
{ goes to pass 1 }
procedure maybe_push_high;
begin
@ -96,7 +98,7 @@ implementation
push_value_para(hightree,calloption,para_offset,4,paraitem.paraloc);
end;
end;
{$endif VS_HIDDEN}
var
otlabel,oflabel : tasmlabel;
@ -198,7 +200,9 @@ implementation
{$ifdef unused}
if not push_from_left_to_right then
{$endif unused}
{$ifndef VS_HIDDEN}
maybe_push_high;
{$endif VS_HIDDEN}
if (paraitem.paratyp=vs_out) and
assigned(paraitem.paratype.def) and
not is_class(paraitem.paratype.def) and
@ -261,7 +265,9 @@ implementation
{$ifdef unused}
if not push_from_left_to_right then
{$endif unused}
{$ifndef VS_HIDDEN}
maybe_push_high;
{$endif VS_HIDDEN}
inc(pushedparasize,4);
if calloption=pocall_inline then
begin
@ -1549,7 +1555,10 @@ begin
end.
{
$Log$
Revision 1.31 2002-12-15 21:30:12 florian
Revision 1.32 2002-12-15 22:50:00 florian
+ some stuff for the new hidden parameter handling added
Revision 1.31 2002/12/15 21:30:12 florian
* tcallnode.paraitem introduced, all references to defcoll removed
Revision 1.30 2002/11/27 20:04:39 peter