|
@@ -173,11 +173,16 @@ implementation
|
|
counter : longint;
|
|
counter : longint;
|
|
ppn : tcallparanode;
|
|
ppn : tcallparanode;
|
|
dummycoll : tparaitem;
|
|
dummycoll : tparaitem;
|
|
- isreal : boolean;
|
|
|
|
vl,vl2 : longint;
|
|
vl,vl2 : longint;
|
|
vr : bestreal;
|
|
vr : bestreal;
|
|
- hp : tnode;
|
|
|
|
|
|
+ hp : tnode;
|
|
srsym : tsym;
|
|
srsym : tsym;
|
|
|
|
+ p1,hpp : tnode;
|
|
|
|
+ frac_para,
|
|
|
|
+ length_para : tnode;
|
|
|
|
+ isreal,
|
|
|
|
+ iswrite,
|
|
|
|
+ file_is_typed : boolean;
|
|
label
|
|
label
|
|
myexit;
|
|
myexit;
|
|
begin
|
|
begin
|
|
@@ -725,11 +730,189 @@ implementation
|
|
in_writeln_x :
|
|
in_writeln_x :
|
|
begin
|
|
begin
|
|
resulttype:=voidtype;
|
|
resulttype:=voidtype;
|
|
|
|
+ { we must know if it is a typed file or not }
|
|
|
|
+ { but we must first do the firstpass for it }
|
|
|
|
+ file_is_typed:=false;
|
|
|
|
+ if assigned(left) then
|
|
|
|
+ begin
|
|
|
|
+ iswrite:=(inlinenumber in [in_write_x,in_writeln_x]);
|
|
|
|
+ set_varstate(left,iswrite);
|
|
|
|
+ { now we can check }
|
|
|
|
+ hp:=left;
|
|
|
|
+ while assigned(tcallparanode(hp).right) do
|
|
|
|
+ hp:=tcallparanode(hp).right;
|
|
|
|
+ { if resulttype.def is not assigned, then automatically }
|
|
|
|
+ { file is not typed. }
|
|
|
|
+ if assigned(hp) and assigned(hp.resulttype.def) then
|
|
|
|
+ Begin
|
|
|
|
+ if (hp.resulttype.def.deftype=filedef) then
|
|
|
|
+ if (tfiledef(hp.resulttype.def).filetyp=ft_untyped) then
|
|
|
|
+ begin
|
|
|
|
+ if (inlinenumber in [in_readln_x,in_writeln_x]) then
|
|
|
|
+ CGMessage(type_e_no_readln_writeln_for_typed_file)
|
|
|
|
+ else
|
|
|
|
+ CGMessage(type_e_no_read_write_for_untyped_file);
|
|
|
|
+ end
|
|
|
|
+ else if (tfiledef(hp.resulttype.def).filetyp=ft_typed) then
|
|
|
|
+ begin
|
|
|
|
+ file_is_typed:=true;
|
|
|
|
+ { test the type }
|
|
|
|
+ if (inlinenumber in [in_readln_x,in_writeln_x]) then
|
|
|
|
+ CGMessage(type_e_no_readln_writeln_for_typed_file);
|
|
|
|
+ hpp:=left;
|
|
|
|
+ while (hpp<>hp) do
|
|
|
|
+ begin
|
|
|
|
+ if (tcallparanode(hpp).left.nodetype=typen) then
|
|
|
|
+ CGMessage(type_e_cant_read_write_type);
|
|
|
|
+ if not is_equal(hpp.resulttype.def,tfiledef(hp.resulttype.def).typedfiletype.def) then
|
|
|
|
+ CGMessage(type_e_mismatch);
|
|
|
|
+ { generate the high() value for the shortstring }
|
|
|
|
+ if ((not iswrite) and is_shortstring(tcallparanode(hpp).left.resulttype.def)) or
|
|
|
|
+ (is_chararray(tcallparanode(hpp).left.resulttype.def)) then
|
|
|
|
+ tcallparanode(hpp).gen_high_tree(true);
|
|
|
|
+ { read(ln) is call by reference (JM) }
|
|
|
|
+ if not iswrite then
|
|
|
|
+ make_not_regable(tcallparanode(hpp).left);
|
|
|
|
+ hpp:=tcallparanode(hpp).right;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ end; { endif assigned(hp) }
|
|
|
|
+
|
|
|
|
+ { insert type conversions for write(ln) }
|
|
|
|
+ if (not file_is_typed) then
|
|
|
|
+ begin
|
|
|
|
+ hp:=left;
|
|
|
|
+ while assigned(hp) do
|
|
|
|
+ begin
|
|
|
|
+ if (tcallparanode(hp).left.nodetype=typen) then
|
|
|
|
+ CGMessage(type_e_cant_read_write_type);
|
|
|
|
+ if assigned(tcallparanode(hp).left.resulttype.def) then
|
|
|
|
+ begin
|
|
|
|
+ isreal:=false;
|
|
|
|
+ { support writeln(procvar) }
|
|
|
|
+ if (tcallparanode(hp).left.resulttype.def.deftype=procvardef) then
|
|
|
|
+ begin
|
|
|
|
+ p1:=ccallnode.create(nil,nil,nil,nil);
|
|
|
|
+ tcallnode(p1).set_procvar(tcallparanode(hp).left);
|
|
|
|
+ resulttypepass(p1);
|
|
|
|
+ tcallparanode(hp).left:=p1;
|
|
|
|
+ end;
|
|
|
|
+ case tcallparanode(hp).left.resulttype.def.deftype of
|
|
|
|
+ filedef :
|
|
|
|
+ begin
|
|
|
|
+ { only allowed as first parameter }
|
|
|
|
+ if assigned(tcallparanode(hp).right) then
|
|
|
|
+ CGMessage(type_e_cant_read_write_type);
|
|
|
|
+ end;
|
|
|
|
+ stringdef :
|
|
|
|
+ begin
|
|
|
|
+ { generate the high() value for the shortstring }
|
|
|
|
+ if (not iswrite) and
|
|
|
|
+ is_shortstring(tcallparanode(hp).left.resulttype.def) then
|
|
|
|
+ tcallparanode(hp).gen_high_tree(true);
|
|
|
|
+ end;
|
|
|
|
+ pointerdef :
|
|
|
|
+ begin
|
|
|
|
+ if not is_pchar(tcallparanode(hp).left.resulttype.def) then
|
|
|
|
+ CGMessage(type_e_cant_read_write_type);
|
|
|
|
+ end;
|
|
|
|
+ floatdef :
|
|
|
|
+ begin
|
|
|
|
+ isreal:=true;
|
|
|
|
+ end;
|
|
|
|
+ orddef :
|
|
|
|
+ begin
|
|
|
|
+ case torddef(tcallparanode(hp).left.resulttype.def).typ of
|
|
|
|
+ uchar,
|
|
|
|
+ u32bit,s32bit,
|
|
|
|
+ u64bit,s64bit:
|
|
|
|
+ ;
|
|
|
|
+ u8bit,s8bit,
|
|
|
|
+ u16bit,s16bit :
|
|
|
|
+ if iswrite then
|
|
|
|
+ inserttypeconv(tcallparanode(hp).left,s32bittype);
|
|
|
|
+ bool8bit,
|
|
|
|
+ bool16bit,
|
|
|
|
+ bool32bit :
|
|
|
|
+ if iswrite then
|
|
|
|
+ inserttypeconv(tcallparanode(hp).left,booltype)
|
|
|
|
+ else
|
|
|
|
+ CGMessage(type_e_cant_read_write_type);
|
|
|
|
+ else
|
|
|
|
+ CGMessage(type_e_cant_read_write_type);
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ arraydef :
|
|
|
|
+ begin
|
|
|
|
+ if is_chararray(tcallparanode(hp).left.resulttype.def) then
|
|
|
|
+ tcallparanode(hp).gen_high_tree(true)
|
|
|
|
+ else
|
|
|
|
+ CGMessage(type_e_cant_read_write_type);
|
|
|
|
+ end;
|
|
|
|
+ else
|
|
|
|
+ CGMessage(type_e_cant_read_write_type);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ { some format options ? }
|
|
|
|
+ if cpf_is_colon_para in tcallparanode(hp).callparaflags then
|
|
|
|
+ begin
|
|
|
|
+ if cpf_is_colon_para in tcallparanode(tcallparanode(hp).right).callparaflags then
|
|
|
|
+ begin
|
|
|
|
+ frac_para:=hp;
|
|
|
|
+ length_para:=tcallparanode(hp).right;
|
|
|
|
+ hp:=tcallparanode(hp).right;
|
|
|
|
+ hpp:=tcallparanode(hp).right;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ begin
|
|
|
|
+ length_para:=hp;
|
|
|
|
+ frac_para:=nil;
|
|
|
|
+ hpp:=tcallparanode(hp).right;
|
|
|
|
+ end;
|
|
|
|
+ { can be nil if you use "write(e:0:6)" while e is undeclared (JM) }
|
|
|
|
+ if assigned(tcallparanode(hpp).left.resulttype.def) then
|
|
|
|
+ isreal:=(tcallparanode(hpp).left.resulttype.def.deftype=floatdef)
|
|
|
|
+ else
|
|
|
|
+ exit;
|
|
|
|
+ if (not is_integer(tcallparanode(length_para).left.resulttype.def)) then
|
|
|
|
+ CGMessage1(type_e_integer_expr_expected,tcallparanode(length_para).left.resulttype.def.typename)
|
|
|
|
+ else
|
|
|
|
+ inserttypeconv(tcallparanode(length_para).left,s32bittype);
|
|
|
|
+ if assigned(frac_para) then
|
|
|
|
+ begin
|
|
|
|
+ if isreal then
|
|
|
|
+ begin
|
|
|
|
+ if (not is_integer(tcallparanode(frac_para).left.resulttype.def)) then
|
|
|
|
+ CGMessage1(type_e_integer_expr_expected,tcallparanode(frac_para).left.resulttype.def.typename)
|
|
|
|
+ else
|
|
|
|
+ inserttypeconv(tcallparanode(frac_para).left,s32bittype);
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ CGMessage(parser_e_illegal_colon_qualifier);
|
|
|
|
+ end;
|
|
|
|
+ { do the checking for the colon'd arg }
|
|
|
|
+ hp:=length_para;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ hp:=tcallparanode(hp).right;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ if codegenerror then
|
|
|
|
+ exit;
|
|
|
|
+ set_varstate(left,true);
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
|
|
|
|
in_settextbuf_file_x :
|
|
in_settextbuf_file_x :
|
|
begin
|
|
begin
|
|
resulttype:=voidtype;
|
|
resulttype:=voidtype;
|
|
|
|
+ { now we know the type of buffer }
|
|
|
|
+ srsym:=searchsymonlyin(systemunit,'SETTEXTBUF');
|
|
|
|
+ hp:=ccallparanode.create(cordconstnode.create(tcallparanode(left).left.resulttype.def.size,s32bittype),left);
|
|
|
|
+ hp:=ccallnode.create(hp,tprocsym(srsym),systemunit,nil);
|
|
|
|
+ left:=nil;
|
|
|
|
+ resulttypepass(hp);
|
|
|
|
+ result:=hp;
|
|
end;
|
|
end;
|
|
|
|
|
|
{ the firstpass of the arg has been done in firstcalln ? }
|
|
{ the firstpass of the arg has been done in firstcalln ? }
|
|
@@ -744,11 +927,137 @@ implementation
|
|
begin
|
|
begin
|
|
resulttype:=voidtype;
|
|
resulttype:=voidtype;
|
|
set_varstate(left,false);
|
|
set_varstate(left,false);
|
|
|
|
+ { remove warning when result is passed }
|
|
|
|
+ set_funcret_is_valid(tcallparanode(left).left);
|
|
|
|
+ set_varstate(tcallparanode(tcallparanode(left).right).left,true);
|
|
|
|
+ hp:=left;
|
|
|
|
+ { valid string ? }
|
|
|
|
+ if not assigned(hp) or
|
|
|
|
+ (tcallparanode(hp).left.resulttype.def.deftype<>stringdef) or
|
|
|
|
+ (tcallparanode(hp).right=nil) then
|
|
|
|
+ CGMessage(cg_e_illegal_expression);
|
|
|
|
+ { we need a var parameter }
|
|
|
|
+ valid_for_assign(tcallparanode(hp).left,false);
|
|
|
|
+ { generate the high() value for the shortstring }
|
|
|
|
+ if is_shortstring(tcallparanode(hp).left.resulttype.def) then
|
|
|
|
+ tcallparanode(hp).gen_high_tree(true);
|
|
|
|
+ { !!!! check length of string }
|
|
|
|
+ while assigned(tcallparanode(hp).right) do
|
|
|
|
+ hp:=tcallparanode(hp).right;
|
|
|
|
+ if not assigned(tcallparanode(hp).resulttype.def) then
|
|
|
|
+ exit;
|
|
|
|
+ { check and convert the first param }
|
|
|
|
+ if (cpf_is_colon_para in tcallparanode(hp).callparaflags) or
|
|
|
|
+ not assigned(hp.resulttype.def) then
|
|
|
|
+ CGMessage(cg_e_illegal_expression);
|
|
|
|
+
|
|
|
|
+ isreal:=false;
|
|
|
|
+ case hp.resulttype.def.deftype of
|
|
|
|
+ orddef :
|
|
|
|
+ begin
|
|
|
|
+ case torddef(tcallparanode(hp).left.resulttype.def).typ of
|
|
|
|
+ u32bit,s32bit,
|
|
|
|
+ s64bit,u64bit:
|
|
|
|
+ ;
|
|
|
|
+ u8bit,s8bit,
|
|
|
|
+ u16bit,s16bit:
|
|
|
|
+ inserttypeconv(tcallparanode(hp).left,s32bittype);
|
|
|
|
+ else
|
|
|
|
+ CGMessage(type_e_integer_or_real_expr_expected);
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ floatdef :
|
|
|
|
+ begin
|
|
|
|
+ isreal:=true;
|
|
|
|
+ end;
|
|
|
|
+ else
|
|
|
|
+ CGMessage(type_e_integer_or_real_expr_expected);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ { some format options ? }
|
|
|
|
+ hpp:=tcallparanode(left).right;
|
|
|
|
+ if assigned(hpp) and (cpf_is_colon_para in tcallparanode(hpp).callparaflags) then
|
|
|
|
+ begin
|
|
|
|
+ set_varstate(tcallparanode(hpp).left,true);
|
|
|
|
+ if (not is_integer(tcallparanode(hpp).left.resulttype.def)) then
|
|
|
|
+ CGMessage1(type_e_integer_expr_expected,tcallparanode(hpp).left.resulttype.def.typename)
|
|
|
|
+ else
|
|
|
|
+ inserttypeconv(tcallparanode(hpp).left,s32bittype);
|
|
|
|
+ hpp:=tcallparanode(hpp).right;
|
|
|
|
+ if assigned(hpp) and (cpf_is_colon_para in tcallparanode(hpp).callparaflags) then
|
|
|
|
+ begin
|
|
|
|
+ if isreal then
|
|
|
|
+ begin
|
|
|
|
+ if (not is_integer(tcallparanode(hpp).left.resulttype.def)) then
|
|
|
|
+ CGMessage1(type_e_integer_expr_expected,tcallparanode(hpp).left.resulttype.def.typename)
|
|
|
|
+ else
|
|
|
|
+ begin
|
|
|
|
+ set_varstate(tcallparanode(hpp).left,true);
|
|
|
|
+ inserttypeconv(tcallparanode(hpp).left,s32bittype);
|
|
|
|
+ end;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ CGMessage(parser_e_illegal_colon_qualifier);
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
|
|
|
|
in_val_x :
|
|
in_val_x :
|
|
begin
|
|
begin
|
|
resulttype:=voidtype;
|
|
resulttype:=voidtype;
|
|
|
|
+ { check the amount of parameters }
|
|
|
|
+ if not(assigned(left)) or
|
|
|
|
+ not(assigned(tcallparanode(left).right)) then
|
|
|
|
+ begin
|
|
|
|
+ CGMessage(parser_e_wrong_parameter_size);
|
|
|
|
+ exit;
|
|
|
|
+ end;
|
|
|
|
+ { there is a "code" parameter }
|
|
|
|
+ If Assigned(tcallparanode(tcallparanode(left).right).right) Then
|
|
|
|
+ Begin
|
|
|
|
+ { first pass just the code parameter for first local use}
|
|
|
|
+ hp := tcallparanode(left).right;
|
|
|
|
+ tcallparanode(left).right := nil;
|
|
|
|
+ make_not_regable(tcallparanode(left).left);
|
|
|
|
+ set_varstate(left,false);
|
|
|
|
+ if codegenerror then
|
|
|
|
+ exit;
|
|
|
|
+ tcallparanode(left).right := hp;
|
|
|
|
+ { code has to be a var parameter }
|
|
|
|
+ if valid_for_assign(tcallparanode(left).left,false) then
|
|
|
|
+ begin
|
|
|
|
+ if (tcallparanode(left).left.resulttype.def.deftype <> orddef) or
|
|
|
|
+ not(torddef(tcallparanode(left).left.resulttype.def).typ in [u16bit,s16bit,u32bit,s32bit]) then
|
|
|
|
+ CGMessage(type_e_mismatch);
|
|
|
|
+ end;
|
|
|
|
+ hpp := tcallparanode(left).right
|
|
|
|
+ End
|
|
|
|
+ Else
|
|
|
|
+ hpp := left;
|
|
|
|
+ { now hpp = the destination value tree }
|
|
|
|
+ { first pass just the destination parameter for first local use }
|
|
|
|
+ hp:=tcallparanode(hpp).right;
|
|
|
|
+ tcallparanode(hpp).right:=nil;
|
|
|
|
+ { hpp = destination }
|
|
|
|
+ make_not_regable(tcallparanode(hpp).left);
|
|
|
|
+ set_varstate(hpp,false);
|
|
|
|
+ if codegenerror then
|
|
|
|
+ exit;
|
|
|
|
+ { remove warning when result is passed }
|
|
|
|
+ set_funcret_is_valid(tcallparanode(hpp).left);
|
|
|
|
+ tcallparanode(hpp).right := hp;
|
|
|
|
+ if valid_for_assign(tcallparanode(hpp).left,false) then
|
|
|
|
+ begin
|
|
|
|
+ If Not((tcallparanode(hpp).left.resulttype.def.deftype = floatdef) or
|
|
|
|
+ is_integer(tcallparanode(hpp).left.resulttype.def)) then
|
|
|
|
+ CGMessage(type_e_mismatch);
|
|
|
|
+ end;
|
|
|
|
+ { hp = source (String) }
|
|
|
|
+ { if not a stringdef then insert a type conv which
|
|
|
|
+ does the other type checking }
|
|
|
|
+ If (tcallparanode(hp).left.resulttype.def.deftype<>stringdef) then
|
|
|
|
+ inserttypeconv(tcallparanode(hp).left,cshortstringtype);
|
|
|
|
+ set_varstate(hp,true);
|
|
end;
|
|
end;
|
|
|
|
|
|
in_include_x_y,
|
|
in_include_x_y,
|
|
@@ -1000,6 +1309,13 @@ implementation
|
|
end;
|
|
end;
|
|
|
|
|
|
myexit:
|
|
myexit:
|
|
|
|
+ { Run get_paratype again to update maybe inserted typeconvs }
|
|
|
|
+ if not codegenerror then
|
|
|
|
+ begin
|
|
|
|
+ if assigned(left) and
|
|
|
|
+ (left.nodetype=callparan) then
|
|
|
|
+ tcallparanode(left).get_paratype;
|
|
|
|
+ end;
|
|
dec(parsing_para_level);
|
|
dec(parsing_para_level);
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -1009,13 +1325,9 @@ implementation
|
|
{$endif fpc}
|
|
{$endif fpc}
|
|
function tinlinenode.pass_1 : tnode;
|
|
function tinlinenode.pass_1 : tnode;
|
|
var
|
|
var
|
|
- p1,hp,hpp : tnode;
|
|
|
|
- srsym : tsym;
|
|
|
|
-{$ifndef NOCOLONCHECK}
|
|
|
|
- frac_para,length_para : tnode;
|
|
|
|
-{$endif ndef NOCOLONCHECK}
|
|
|
|
|
|
+ srsym : tsym;
|
|
|
|
+ hp,hpp : tnode;
|
|
extra_register,
|
|
extra_register,
|
|
- isreal,
|
|
|
|
iswrite,
|
|
iswrite,
|
|
file_is_typed : boolean;
|
|
file_is_typed : boolean;
|
|
|
|
|
|
@@ -1202,50 +1514,18 @@ implementation
|
|
if assigned(left) then
|
|
if assigned(left) then
|
|
begin
|
|
begin
|
|
iswrite:=(inlinenumber in [in_write_x,in_writeln_x]);
|
|
iswrite:=(inlinenumber in [in_write_x,in_writeln_x]);
|
|
- tcallparanode(left).firstcallparan(nil,true);
|
|
|
|
- set_varstate(left,iswrite);
|
|
|
|
{ now we can check }
|
|
{ now we can check }
|
|
hp:=left;
|
|
hp:=left;
|
|
while assigned(tcallparanode(hp).right) do
|
|
while assigned(tcallparanode(hp).right) do
|
|
hp:=tcallparanode(hp).right;
|
|
hp:=tcallparanode(hp).right;
|
|
{ if resulttype.def is not assigned, then automatically }
|
|
{ if resulttype.def is not assigned, then automatically }
|
|
{ file is not typed. }
|
|
{ file is not typed. }
|
|
- if assigned(hp) and assigned(hp.resulttype.def) then
|
|
|
|
|
|
+ if assigned(hp) then
|
|
Begin
|
|
Begin
|
|
- if (hp.resulttype.def.deftype=filedef) then
|
|
|
|
- if (tfiledef(hp.resulttype.def).filetyp=ft_untyped) then
|
|
|
|
- begin
|
|
|
|
- if (inlinenumber in [in_readln_x,in_writeln_x]) then
|
|
|
|
- CGMessage(type_e_no_readln_writeln_for_typed_file)
|
|
|
|
- else
|
|
|
|
- CGMessage(type_e_no_read_write_for_untyped_file);
|
|
|
|
- end
|
|
|
|
- else if (tfiledef(hp.resulttype.def).filetyp=ft_typed) then
|
|
|
|
- begin
|
|
|
|
- file_is_typed:=true;
|
|
|
|
- { test the type }
|
|
|
|
- if (inlinenumber in [in_readln_x,in_writeln_x]) then
|
|
|
|
- CGMessage(type_e_no_readln_writeln_for_typed_file);
|
|
|
|
- hpp:=left;
|
|
|
|
- while (hpp<>hp) do
|
|
|
|
- begin
|
|
|
|
- if (tcallparanode(hpp).left.nodetype=typen) then
|
|
|
|
- CGMessage(type_e_cant_read_write_type);
|
|
|
|
- if not is_equal(hpp.resulttype.def,tfiledef(hp.resulttype.def).typedfiletype.def) then
|
|
|
|
- CGMessage(type_e_mismatch);
|
|
|
|
- { generate the high() value for the shortstring }
|
|
|
|
- if ((not iswrite) and is_shortstring(tcallparanode(hpp).left.resulttype.def)) or
|
|
|
|
- (is_chararray(tcallparanode(hpp).left.resulttype.def)) then
|
|
|
|
- tcallparanode(hpp).gen_high_tree(true);
|
|
|
|
- { read(ln) is call by reference (JM) }
|
|
|
|
- if not iswrite then
|
|
|
|
- make_not_regable(tcallparanode(hpp).left);
|
|
|
|
- hpp:=tcallparanode(hpp).right;
|
|
|
|
- end;
|
|
|
|
- end;
|
|
|
|
|
|
+ if (hp.resulttype.def.deftype=filedef) and
|
|
|
|
+ (tfiledef(hp.resulttype.def).filetyp=ft_typed) then
|
|
|
|
+ file_is_typed:=true;
|
|
end; { endif assigned(hp) }
|
|
end; { endif assigned(hp) }
|
|
-
|
|
|
|
- { insert type conversions for write(ln) }
|
|
|
|
if (not file_is_typed) then
|
|
if (not file_is_typed) then
|
|
begin
|
|
begin
|
|
hp:=left;
|
|
hp:=left;
|
|
@@ -1256,126 +1536,20 @@ implementation
|
|
{$else}
|
|
{$else}
|
|
incrementregisterpushed(ALL_REGISTERS);
|
|
incrementregisterpushed(ALL_REGISTERS);
|
|
{$endif}
|
|
{$endif}
|
|
- if (tcallparanode(hp).left.nodetype=typen) then
|
|
|
|
- CGMessage(type_e_cant_read_write_type);
|
|
|
|
if assigned(tcallparanode(hp).left.resulttype.def) then
|
|
if assigned(tcallparanode(hp).left.resulttype.def) then
|
|
begin
|
|
begin
|
|
- isreal:=false;
|
|
|
|
- { support writeln(procvar) }
|
|
|
|
- if (tcallparanode(hp).left.resulttype.def.deftype=procvardef) then
|
|
|
|
- begin
|
|
|
|
- p1:=ccallnode.create(nil,nil,nil,nil);
|
|
|
|
- tcallnode(p1).set_procvar(tcallparanode(hp).left);
|
|
|
|
- firstpass(p1);
|
|
|
|
- tcallparanode(hp).left:=p1;
|
|
|
|
- end;
|
|
|
|
case tcallparanode(hp).left.resulttype.def.deftype of
|
|
case tcallparanode(hp).left.resulttype.def.deftype of
|
|
- filedef :
|
|
|
|
- begin
|
|
|
|
- { only allowed as first parameter }
|
|
|
|
- if assigned(tcallparanode(hp).right) then
|
|
|
|
- CGMessage(type_e_cant_read_write_type);
|
|
|
|
- end;
|
|
|
|
- stringdef :
|
|
|
|
- begin
|
|
|
|
- { generate the high() value for the shortstring }
|
|
|
|
- if (not iswrite) and
|
|
|
|
- is_shortstring(tcallparanode(hp).left.resulttype.def) then
|
|
|
|
- tcallparanode(hp).gen_high_tree(true);
|
|
|
|
- end;
|
|
|
|
- pointerdef :
|
|
|
|
- begin
|
|
|
|
- if not is_pchar(tcallparanode(hp).left.resulttype.def) then
|
|
|
|
- CGMessage(type_e_cant_read_write_type);
|
|
|
|
- end;
|
|
|
|
- floatdef :
|
|
|
|
- begin
|
|
|
|
- isreal:=true;
|
|
|
|
- end;
|
|
|
|
orddef :
|
|
orddef :
|
|
begin
|
|
begin
|
|
- case torddef(tcallparanode(hp).left.resulttype.def).typ of
|
|
|
|
- uchar,
|
|
|
|
- u32bit,s32bit,
|
|
|
|
- u64bit,s64bit:
|
|
|
|
- ;
|
|
|
|
- u8bit,s8bit,
|
|
|
|
- u16bit,s16bit :
|
|
|
|
- if iswrite then
|
|
|
|
- tcallparanode(hp).left:=ctypeconvnode.create(tcallparanode(hp).left,s32bittype);
|
|
|
|
- bool8bit,
|
|
|
|
- bool16bit,
|
|
|
|
- bool32bit :
|
|
|
|
- if iswrite then
|
|
|
|
- tcallparanode(hp).left:=ctypeconvnode.create(tcallparanode(hp).left,booltype)
|
|
|
|
- else
|
|
|
|
- CGMessage(type_e_cant_read_write_type);
|
|
|
|
- else
|
|
|
|
- CGMessage(type_e_cant_read_write_type);
|
|
|
|
- end;
|
|
|
|
if not(iswrite) and
|
|
if not(iswrite) and
|
|
- not(is_64bitint(tcallparanode(hp).left.resulttype.def)) then
|
|
|
|
|
|
+ not(is_64bitint(tcallparanode(hp).left.resulttype.def)) then
|
|
extra_register:=true;
|
|
extra_register:=true;
|
|
end;
|
|
end;
|
|
- arraydef :
|
|
|
|
- begin
|
|
|
|
- if is_chararray(tcallparanode(hp).left.resulttype.def) then
|
|
|
|
- tcallparanode(hp).gen_high_tree(true)
|
|
|
|
- else
|
|
|
|
- CGMessage(type_e_cant_read_write_type);
|
|
|
|
- end;
|
|
|
|
- else
|
|
|
|
- CGMessage(type_e_cant_read_write_type);
|
|
|
|
end;
|
|
end;
|
|
-
|
|
|
|
- { some format options ? }
|
|
|
|
- if cpf_is_colon_para in tcallparanode(hp).callparaflags then
|
|
|
|
- begin
|
|
|
|
- if cpf_is_colon_para in tcallparanode(tcallparanode(hp).right).callparaflags then
|
|
|
|
- begin
|
|
|
|
- frac_para:=hp;
|
|
|
|
- length_para:=tcallparanode(hp).right;
|
|
|
|
- hp:=tcallparanode(hp).right;
|
|
|
|
- hpp:=tcallparanode(hp).right;
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
- length_para:=hp;
|
|
|
|
- frac_para:=nil;
|
|
|
|
- hpp:=tcallparanode(hp).right;
|
|
|
|
- end;
|
|
|
|
- { can be nil if you use "write(e:0:6)" while e is undeclared (JM) }
|
|
|
|
- if assigned(tcallparanode(hpp).left.resulttype.def) then
|
|
|
|
- isreal:=(tcallparanode(hpp).left.resulttype.def.deftype=floatdef)
|
|
|
|
- else exit;
|
|
|
|
- if (not is_integer(tcallparanode(length_para).left.resulttype.def)) then
|
|
|
|
- CGMessage1(type_e_integer_expr_expected,tcallparanode(length_para).left.resulttype.def.typename)
|
|
|
|
- else
|
|
|
|
- tcallparanode(length_para).left:=ctypeconvnode.create(tcallparanode(length_para).left,s32bittype);
|
|
|
|
- if assigned(frac_para) then
|
|
|
|
- begin
|
|
|
|
- if isreal then
|
|
|
|
- begin
|
|
|
|
- if (not is_integer(tcallparanode(frac_para).left.resulttype.def)) then
|
|
|
|
- CGMessage1(type_e_integer_expr_expected,tcallparanode(frac_para).left.resulttype.def.typename)
|
|
|
|
- else
|
|
|
|
- tcallparanode(frac_para).left:=ctypeconvnode.create(tcallparanode(frac_para).left,s32bittype);
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- CGMessage(parser_e_illegal_colon_qualifier);
|
|
|
|
- end;
|
|
|
|
- { do the checking for the colon'd arg }
|
|
|
|
- hp:=length_para;
|
|
|
|
- end;
|
|
|
|
end;
|
|
end;
|
|
hp:=tcallparanode(hp).right;
|
|
hp:=tcallparanode(hp).right;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
- { pass all parameters again for the typeconversions }
|
|
|
|
- if codegenerror then
|
|
|
|
- exit;
|
|
|
|
- tcallparanode(left).firstcallparan(nil,true);
|
|
|
|
- set_varstate(left,true);
|
|
|
|
{ calc registers }
|
|
{ calc registers }
|
|
left_max;
|
|
left_max;
|
|
if extra_register then
|
|
if extra_register then
|
|
@@ -1384,21 +1558,7 @@ implementation
|
|
end;
|
|
end;
|
|
|
|
|
|
in_settextbuf_file_x :
|
|
in_settextbuf_file_x :
|
|
- begin
|
|
|
|
- { warning here left is the callparannode
|
|
|
|
- not the argument directly }
|
|
|
|
- { left.left is text var }
|
|
|
|
- { left.right.left is the buffer var }
|
|
|
|
- { firstcallparan(left,nil);
|
|
|
|
- already done in firstcalln }
|
|
|
|
- { now we know the type of buffer }
|
|
|
|
- srsym:=searchsymonlyin(systemunit,'SETTEXTBUF');
|
|
|
|
- hp:=ccallparanode.create(cordconstnode.create(tcallparanode(left).left.resulttype.def.size,s32bittype),left);
|
|
|
|
- hp:=ccallnode.create(hp,tprocsym(srsym),systemunit,nil);
|
|
|
|
- left:=nil;
|
|
|
|
- firstpass(hp);
|
|
|
|
- result:=hp;
|
|
|
|
- end;
|
|
|
|
|
|
+ internalerror(200104262);
|
|
|
|
|
|
in_reset_typedfile,
|
|
in_reset_typedfile,
|
|
in_rewrite_typedfile :
|
|
in_rewrite_typedfile :
|
|
@@ -1409,95 +1569,6 @@ implementation
|
|
in_str_x_string :
|
|
in_str_x_string :
|
|
begin
|
|
begin
|
|
procinfo^.flags:=procinfo^.flags or pi_do_call;
|
|
procinfo^.flags:=procinfo^.flags or pi_do_call;
|
|
- { first pass just the string for first local use }
|
|
|
|
- hp:=tcallparanode(left).right;
|
|
|
|
- tcallparanode(left).right:=nil;
|
|
|
|
- tcallparanode(left).firstcallparan(nil,true);
|
|
|
|
- { remove warning when result is passed }
|
|
|
|
- set_funcret_is_valid(tcallparanode(left).left);
|
|
|
|
- tcallparanode(left).right:=hp;
|
|
|
|
- tcallparanode(tcallparanode(left).right).firstcallparan(nil,true);
|
|
|
|
- set_varstate(tcallparanode(left).right,true);
|
|
|
|
- hp:=left;
|
|
|
|
- { valid string ? }
|
|
|
|
- if not assigned(hp) or
|
|
|
|
- (tcallparanode(hp).left.resulttype.def.deftype<>stringdef) or
|
|
|
|
- (tcallparanode(hp).right=nil) then
|
|
|
|
- CGMessage(cg_e_illegal_expression);
|
|
|
|
- { we need a var parameter }
|
|
|
|
- valid_for_assign(tcallparanode(hp).left,false);
|
|
|
|
- { generate the high() value for the shortstring }
|
|
|
|
- if is_shortstring(tcallparanode(hp).left.resulttype.def) then
|
|
|
|
- tcallparanode(hp).gen_high_tree(true);
|
|
|
|
-
|
|
|
|
- { !!!! check length of string }
|
|
|
|
-
|
|
|
|
- while assigned(tcallparanode(hp).right) do
|
|
|
|
- hp:=tcallparanode(hp).right;
|
|
|
|
-
|
|
|
|
- if not assigned(tcallparanode(hp).resulttype.def) then
|
|
|
|
- exit;
|
|
|
|
- { check and convert the first param }
|
|
|
|
- if (cpf_is_colon_para in tcallparanode(hp).callparaflags) or
|
|
|
|
- not assigned(hp.resulttype.def) then
|
|
|
|
- CGMessage(cg_e_illegal_expression);
|
|
|
|
-
|
|
|
|
- isreal:=false;
|
|
|
|
- case hp.resulttype.def.deftype of
|
|
|
|
- orddef :
|
|
|
|
- begin
|
|
|
|
- case torddef(tcallparanode(hp).left.resulttype.def).typ of
|
|
|
|
- u32bit,s32bit,
|
|
|
|
- s64bit,u64bit:
|
|
|
|
- ;
|
|
|
|
- u8bit,s8bit,
|
|
|
|
- u16bit,s16bit:
|
|
|
|
- tcallparanode(hp).left:=ctypeconvnode.create(tcallparanode(hp).left,s32bittype);
|
|
|
|
- else
|
|
|
|
- CGMessage(type_e_integer_or_real_expr_expected);
|
|
|
|
- end;
|
|
|
|
- end;
|
|
|
|
- floatdef :
|
|
|
|
- begin
|
|
|
|
- isreal:=true;
|
|
|
|
- end;
|
|
|
|
- else
|
|
|
|
- CGMessage(type_e_integer_or_real_expr_expected);
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
- { some format options ? }
|
|
|
|
- hpp:=tcallparanode(left).right;
|
|
|
|
- if assigned(hpp) and (cpf_is_colon_para in tcallparanode(hpp).callparaflags) then
|
|
|
|
- begin
|
|
|
|
- firstpass(tcallparanode(hpp).left);
|
|
|
|
- set_varstate(tcallparanode(hpp).left,true);
|
|
|
|
- if (not is_integer(tcallparanode(hpp).left.resulttype.def)) then
|
|
|
|
- CGMessage1(type_e_integer_expr_expected,tcallparanode(hpp).left.resulttype.def.typename)
|
|
|
|
- else
|
|
|
|
- tcallparanode(hpp).left:=ctypeconvnode.create(tcallparanode(hpp).left,s32bittype);
|
|
|
|
- hpp:=tcallparanode(hpp).right;
|
|
|
|
- if assigned(hpp) and (cpf_is_colon_para in tcallparanode(hpp).callparaflags) then
|
|
|
|
- begin
|
|
|
|
- if isreal then
|
|
|
|
- begin
|
|
|
|
- if (not is_integer(tcallparanode(hpp).left.resulttype.def)) then
|
|
|
|
- CGMessage1(type_e_integer_expr_expected,tcallparanode(hpp).left.resulttype.def.typename)
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
- firstpass(tcallparanode(hpp).left);
|
|
|
|
- set_varstate(tcallparanode(hpp).left,true);
|
|
|
|
- tcallparanode(hpp).left:=ctypeconvnode.create(tcallparanode(hpp).left,s32bittype);
|
|
|
|
- end;
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- CGMessage(parser_e_illegal_colon_qualifier);
|
|
|
|
- end;
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
- { pass all parameters again for the typeconversions }
|
|
|
|
- if codegenerror then
|
|
|
|
- exit;
|
|
|
|
- tcallparanode(left).firstcallparan(nil,true);
|
|
|
|
{ calc registers }
|
|
{ calc registers }
|
|
left_max;
|
|
left_max;
|
|
end;
|
|
end;
|
|
@@ -1505,77 +1576,16 @@ implementation
|
|
in_val_x :
|
|
in_val_x :
|
|
begin
|
|
begin
|
|
procinfo^.flags:=procinfo^.flags or pi_do_call;
|
|
procinfo^.flags:=procinfo^.flags or pi_do_call;
|
|
- resulttype:=voidtype;
|
|
|
|
- { check the amount of parameters }
|
|
|
|
- if not(assigned(left)) or
|
|
|
|
- not(assigned(tcallparanode(left).right)) then
|
|
|
|
- begin
|
|
|
|
- CGMessage(parser_e_wrong_parameter_size);
|
|
|
|
- exit;
|
|
|
|
- end;
|
|
|
|
- If Assigned(tcallparanode(tcallparanode(left).right).right) Then
|
|
|
|
- {there is a "code" parameter}
|
|
|
|
- Begin
|
|
|
|
- { first pass just the code parameter for first local use}
|
|
|
|
- hp := tcallparanode(left).right;
|
|
|
|
- tcallparanode(left).right := nil;
|
|
|
|
- make_not_regable(tcallparanode(left).left);
|
|
|
|
- tcallparanode(left).firstcallparan(nil,true);
|
|
|
|
- set_varstate(left,false);
|
|
|
|
- if codegenerror then exit;
|
|
|
|
- tcallparanode(left).right := hp;
|
|
|
|
- {code has to be a var parameter}
|
|
|
|
- if valid_for_assign(tcallparanode(left).left,false) then
|
|
|
|
- begin
|
|
|
|
- if (tcallparanode(left).left.resulttype.def.deftype <> orddef) or
|
|
|
|
- not(torddef(tcallparanode(left).left.resulttype.def).typ in
|
|
|
|
- [u16bit,s16bit,u32bit,s32bit]) then
|
|
|
|
- CGMessage(type_e_mismatch);
|
|
|
|
- end;
|
|
|
|
- hpp := tcallparanode(left).right
|
|
|
|
- End
|
|
|
|
- Else hpp := left;
|
|
|
|
- {now hpp = the destination value tree}
|
|
|
|
- { first pass just the destination parameter for first local use}
|
|
|
|
- hp:=tcallparanode(hpp).right;
|
|
|
|
- tcallparanode(hpp).right:=nil;
|
|
|
|
- {hpp = destination}
|
|
|
|
- make_not_regable(tcallparanode(hpp).left);
|
|
|
|
- tcallparanode(hpp).firstcallparan(nil,true);
|
|
|
|
- set_varstate(hpp,false);
|
|
|
|
-
|
|
|
|
- if codegenerror then
|
|
|
|
- exit;
|
|
|
|
- { remove warning when result is passed }
|
|
|
|
- set_funcret_is_valid(tcallparanode(hpp).left);
|
|
|
|
- tcallparanode(hpp).right := hp;
|
|
|
|
- if valid_for_assign(tcallparanode(hpp).left,false) then
|
|
|
|
- begin
|
|
|
|
- If Not((tcallparanode(hpp).left.resulttype.def.deftype = floatdef) or
|
|
|
|
- ((tcallparanode(hpp).left.resulttype.def.deftype = orddef) And
|
|
|
|
- (torddef(tcallparanode(hpp).left.resulttype.def).typ in
|
|
|
|
- [u32bit,s32bit,
|
|
|
|
- u8bit,s8bit,u16bit,s16bit,s64bit,u64bit]))) Then
|
|
|
|
- CGMessage(type_e_mismatch);
|
|
|
|
- end;
|
|
|
|
- {hp = source (String)}
|
|
|
|
- { count_ref := false; WHY ?? }
|
|
|
|
- tcallparanode(hp).firstcallparan(nil,true);
|
|
|
|
- set_varstate(hp,true);
|
|
|
|
- if codegenerror then
|
|
|
|
- exit;
|
|
|
|
- { if not a stringdef then insert a type conv which
|
|
|
|
- does the other type checking }
|
|
|
|
- If (tcallparanode(hp).left.resulttype.def.deftype<>stringdef) then
|
|
|
|
- begin
|
|
|
|
- tcallparanode(hp).left:=ctypeconvnode.create(tcallparanode(hp).left,cshortstringtype);
|
|
|
|
- firstpass(tcallparanode(hp).left);
|
|
|
|
- end;
|
|
|
|
{ calc registers }
|
|
{ calc registers }
|
|
left_max;
|
|
left_max;
|
|
-
|
|
|
|
{ val doesn't calculate the registers really }
|
|
{ val doesn't calculate the registers really }
|
|
{ correct, we need one register extra (FK) }
|
|
{ correct, we need one register extra (FK) }
|
|
|
|
+ { there is a "code" parameter }
|
|
|
|
+ If Assigned(tcallparanode(tcallparanode(left).right).right) Then
|
|
|
|
+ hpp := tcallparanode(left).right
|
|
|
|
+ Else
|
|
|
|
+ hpp := left;
|
|
|
|
+ { now hpp = the destination value tree }
|
|
if is_64bitint(tcallparanode(hpp).left.resulttype.def) then
|
|
if is_64bitint(tcallparanode(hpp).left.resulttype.def) then
|
|
inc(registers32,2)
|
|
inc(registers32,2)
|
|
else
|
|
else
|
|
@@ -1719,7 +1729,11 @@ begin
|
|
end.
|
|
end.
|
|
{
|
|
{
|
|
$Log$
|
|
$Log$
|
|
- Revision 1.38 2001-04-21 12:03:11 peter
|
|
|
|
|
|
+ Revision 1.39 2001-04-26 21:57:05 peter
|
|
|
|
+ * moved code from firstpass to det_resulttype and remove extraneous
|
|
|
|
+ calls to firstcallparan for in_str,in_write,in_val
|
|
|
|
+
|
|
|
|
+ Revision 1.38 2001/04/21 12:03:11 peter
|
|
* m68k updates merged from fixes branch
|
|
* m68k updates merged from fixes branch
|
|
|
|
|
|
Revision 1.37 2001/04/13 22:22:30 peter
|
|
Revision 1.37 2001/04/13 22:22:30 peter
|