mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-11 17:06:14 +02:00
* fixed bug1093 and other string -> chararray conversion bugs
(merged from fixes branch)
This commit is contained in:
parent
3aab08cba8
commit
77d566f4fc
@ -504,50 +504,81 @@ implementation
|
||||
|
||||
procedure second_string_to_chararray(var pto,pfrom : ptree;convtyp : tconverttype);
|
||||
var
|
||||
pushedregs: tpushed;
|
||||
l1 : pasmlabel;
|
||||
hr : preference;
|
||||
arrsize, strtype: longint;
|
||||
regstopush: byte;
|
||||
begin
|
||||
with parraydef(pto^.resulttype)^ do
|
||||
arrsize := highrange-lowrange+1;
|
||||
|
||||
if (pfrom^.treetype = stringconstn) and
|
||||
{ pfrom^.length+1 since there's always a terminating #0 character (JM) }
|
||||
(pfrom^.length+1 >= arrsize) then
|
||||
begin
|
||||
inc(pto^.location.reference.offset);
|
||||
exit;
|
||||
end;
|
||||
clear_location(pto^.location);
|
||||
pto^.location.loc := LOC_REFERENCE;
|
||||
gettempofsizereference(arrsize,pto^.location.reference);
|
||||
|
||||
regstopush := $ff;
|
||||
remove_non_regvars_from_loc(pfrom^.location,regstopush);
|
||||
pushusedregisters(pushedregs,regstopush);
|
||||
|
||||
emit_push_lea_loc(pto^.location,false);
|
||||
|
||||
case pstringdef(pfrom^.resulttype)^.string_typ of
|
||||
st_shortstring :
|
||||
begin
|
||||
inc(pto^.location.reference.offset);
|
||||
{ 0 means shortstring }
|
||||
strtype := 0;
|
||||
del_reference(pfrom^.location.reference);
|
||||
emit_push_lea_loc(pfrom^.location,true);
|
||||
ungetiftemp(pfrom^.location.reference);
|
||||
end;
|
||||
st_ansistring :
|
||||
begin
|
||||
clear_location(pto^.location);
|
||||
pto^.location.loc:=LOC_REFERENCE;
|
||||
reset_reference(pto^.location.reference);
|
||||
getlabel(l1);
|
||||
{ 1 means ansistring }
|
||||
strtype := 1;
|
||||
case pfrom^.location.loc of
|
||||
LOC_CREGISTER,LOC_REGISTER:
|
||||
pto^.location.reference.base:=pfrom^.location.register;
|
||||
begin
|
||||
ungetregister(pfrom^.location.register);
|
||||
emit_push_loc(pfrom^.location);
|
||||
end;
|
||||
LOC_MEM,LOC_REFERENCE:
|
||||
begin
|
||||
pto^.location.reference.base:=getregister32;
|
||||
emit_ref_reg(A_MOV,S_L,newreference(pfrom^.location.reference),
|
||||
pto^.location.reference.base);
|
||||
del_reference(pfrom^.location.reference);
|
||||
emit_push_loc(pfrom^.location);
|
||||
ungetiftemp(pfrom^.location.reference);
|
||||
end;
|
||||
end;
|
||||
emit_const_reg(A_CMP,S_L,0,pto^.location.reference.base);
|
||||
emitjmp(C_NZ,l1);
|
||||
new(hr);
|
||||
reset_reference(hr^);
|
||||
hr^.symbol:=newasmsymbol('FPC_EMPTYCHAR');
|
||||
emit_ref_reg(A_LEA,S_L,hr,pto^.location.reference.base);
|
||||
emitlab(l1);
|
||||
end;
|
||||
st_longstring:
|
||||
begin
|
||||
{!!!!!!!}
|
||||
{ 2 means longstring, but still needs support in FPC_STR_TO_CHARARRAY,
|
||||
which is in i386.inc and/or generic.inc (JM) }
|
||||
strtype := 2;
|
||||
|
||||
internalerror(8888);
|
||||
end;
|
||||
st_widestring:
|
||||
begin
|
||||
{!!!!!!!}
|
||||
{ 3 means widestring, but still needs support in FPC_STR_TO_CHARARRAY,
|
||||
which is in i386.inc and/or generic.inc (JM) }
|
||||
strtype := 3;
|
||||
internalerror(8888);
|
||||
end;
|
||||
end;
|
||||
push_int(arrsize);
|
||||
push_int(strtype);
|
||||
emitcall('FPC_STR_TO_CHARARRAY');
|
||||
popusedregisters(pushedregs);
|
||||
end;
|
||||
|
||||
|
||||
@ -1536,7 +1567,11 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.4 2000-08-02 07:05:32 jonas
|
||||
Revision 1.5 2000-08-09 11:30:21 jonas
|
||||
* fixed bug1093 and other string -> chararray conversion bugs
|
||||
(merged from fixes branch)
|
||||
|
||||
Revision 1.4 2000/08/02 07:05:32 jonas
|
||||
* fixed ie(10) when using -Or and shortstring -> ansistring conversions
|
||||
(or when using a lot of ss -> as conversions in one statement, the
|
||||
source was freed only *after* pushusedregisters($ff), which means its
|
||||
|
Loading…
Reference in New Issue
Block a user