mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 06:28:55 +02:00
* correctly generate accesses to jump tables if it contains negative entries, resolves issue #30119
git-svn-id: trunk@33760 -
This commit is contained in:
parent
963c4aa1f8
commit
57f93ed40d
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -15071,6 +15071,8 @@ tests/webtbs/tw3004.pp svneol=native#text/plain
|
||||
tests/webtbs/tw3005.pp svneol=native#text/plain
|
||||
tests/webtbs/tw30082.pp svneol=native#text/plain
|
||||
tests/webtbs/tw3010.pp svneol=native#text/plain
|
||||
tests/webtbs/tw30119a.pp svneol=native#text/pascal
|
||||
tests/webtbs/tw30119b.pp svneol=native#text/pascal
|
||||
tests/webtbs/tw3012.pp svneol=native#text/plain
|
||||
tests/webtbs/tw30166.pp svneol=native#text/plain
|
||||
tests/webtbs/tw3023.pp svneol=native#text/plain
|
||||
|
@ -112,6 +112,8 @@ implementation
|
||||
{ case expr greater than max_ => goto elselabel }
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,opcgsize,OC_A,aint(max_)-aint(min_),hregister,elselabel);
|
||||
min_:=0;
|
||||
{ do not sign extend when we load the index register, as we applied an offset above }
|
||||
opcgsize:=tcgsize2unsigned[opcgsize];
|
||||
end;
|
||||
current_asmdata.getglobaldatalabel(table);
|
||||
{ make it a 32bit register }
|
||||
|
@ -112,7 +112,10 @@ implementation
|
||||
{ case expr greater than max_ => goto elselabel }
|
||||
cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,opcgsize,OC_A,aint(max_)-aint(min_),hregister,elselabel);
|
||||
min_:=0;
|
||||
{ do not sign extend when we load the index register, as we applied an offset above }
|
||||
opcgsize:=tcgsize2unsigned[opcgsize];
|
||||
end;
|
||||
|
||||
{ local label in order to avoid using GOT }
|
||||
current_asmdata.getlabel(tablelabel,alt_data);
|
||||
indexreg:=cg.makeregsize(current_asmdata.CurrAsmList,hregister,OS_ADDR);
|
||||
|
154
tests/webtbs/tw30119a.pp
Normal file
154
tests/webtbs/tw30119a.pp
Normal file
@ -0,0 +1,154 @@
|
||||
//{$codepage cp_acp}
|
||||
//{$codepage cp1250}
|
||||
|
||||
|
||||
program tw30119;
|
||||
//uses
|
||||
// fkdane,
|
||||
// fkrecord;
|
||||
//uses
|
||||
// cwstring;
|
||||
{$H+}
|
||||
|
||||
|
||||
type
|
||||
|
||||
rButikPtr = ^rButik;
|
||||
rButik =
|
||||
packed record
|
||||
data : word; {2}
|
||||
dowod : word; {4}
|
||||
numer : int64; {12}
|
||||
dataDost : word; {14} {w zamowieniu otwarte 00 }
|
||||
memoa, {16} { 1- dot zamowienia zamkniete 10
|
||||
2- par fisk --> WNT z importu zawieszone 01 anulowane 11
|
||||
|
||||
4- paleta pilne
|
||||
8- (nazwa zestawu) (stare :dot produkcji
|
||||
16- numer odbiorcy w tww
|
||||
32- zablokowane (stare:druga jednostkia cenaP
|
||||
64- poprano z produkcji - wyrob (stere data WZ w twn (norm numer WZ))
|
||||
128 : pole memo w tww
|
||||
|
||||
}
|
||||
vat : byte;
|
||||
towar, {18}
|
||||
dostawca, {20}
|
||||
odbiorca : word; {22}
|
||||
typ : shortint; {23}
|
||||
ilosc, {27}
|
||||
cenaZ, {31}
|
||||
cenaS : single; {35}
|
||||
akwizytor : byte; {36}
|
||||
wolne1 : word; {38} {nr dostawy}
|
||||
cenaE : single; {42}
|
||||
|
||||
end;
|
||||
|
||||
|
||||
const
|
||||
|
||||
ntFakturaIMP = 2;
|
||||
ntKoszt = 3;
|
||||
ntWOC = 4;
|
||||
ntFI = 5;
|
||||
ntPW = 14;
|
||||
ntPrzyjecieTow = 15;
|
||||
ntFakturaExp = 25;
|
||||
ntFakturaSprz = 26;
|
||||
ntKP = 27;
|
||||
ntUslUnia = 28;
|
||||
ntfakturaUSL = 29;{ *}
|
||||
ntPzRWS = 30;
|
||||
ntFakturaSprzVat= 34;
|
||||
ntFakturaUslVat = 35; { faktura do paragonu*}
|
||||
ntZamowienieSprz= 36;
|
||||
ntDetal = 55;
|
||||
ntRW = 65;
|
||||
ntPrzesun = 66;
|
||||
ntDekompl = 67;
|
||||
ntPZO = 68;
|
||||
// ntWymiana = 69;{*}
|
||||
ntFakturaSprzDew = 69;
|
||||
ntReklamacjaVAT = 70;
|
||||
ntPZOVat = 71;
|
||||
ntBO = 77;
|
||||
ntZobowImp = 78;
|
||||
ntWZ = 79;
|
||||
ntZwrotPW = 80;
|
||||
ntKpZ = 81;
|
||||
ntKWz = 82;
|
||||
ntPZOEXP = 83;
|
||||
ntFakturaW = 84;
|
||||
|
||||
|
||||
|
||||
ntExpUnia = 98;
|
||||
ntImpUnia = 99;
|
||||
ntImpUniaM = 100;
|
||||
|
||||
|
||||
ntPZOUnia = 103;
|
||||
|
||||
var
|
||||
tab : array [0..10] of double;
|
||||
|
||||
|
||||
procedure testCaseRaw(const rr : rButik);
|
||||
var
|
||||
kwz: Double;
|
||||
begin
|
||||
kwz:=20;
|
||||
|
||||
|
||||
case rr.typ of
|
||||
ntFakturaSprz,ntFakturaSPrzVat,
|
||||
ntPzoExp,ntPzoUnia,
|
||||
ntPzoVat,ntPzo,
|
||||
|
||||
ntDetal,ntPzRWS,
|
||||
|
||||
ntExpUnia,ntFakturaEXP: begin
|
||||
tab[1]:=tab[1]+rr.ilosc;
|
||||
tab[2]:=tab[2]+kwz;
|
||||
end;
|
||||
ntRW : begin
|
||||
tab[4]:=tab[4]+kwz;
|
||||
end;
|
||||
|
||||
-ntFakturaIMP,
|
||||
-ntPrzyjecietow : begin
|
||||
tab[3]:=tab[3]+kwz;
|
||||
end;
|
||||
-ntBO : begin
|
||||
tab[5]:=tab[5]+kwz;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
procedure testCaseA;
|
||||
var
|
||||
r : rButik;
|
||||
begin
|
||||
// zeruj(r);
|
||||
r.ilosc:=1;
|
||||
r.cenaZ:=10;
|
||||
r.typ:=65;
|
||||
testCaseRaw(r);
|
||||
// checkEquals(10,tab[4]);
|
||||
r.typ:=-ntPrzyjecieTow;
|
||||
testCaseRaw(r);
|
||||
// checkEquals(10,tab[3]);
|
||||
r.typ:=65;
|
||||
testCaseRaw(r);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
begin
|
||||
writeln('start');
|
||||
testCaseA;
|
||||
writeln('stop') ;
|
||||
end.
|
158
tests/webtbs/tw30119b.pp
Normal file
158
tests/webtbs/tw30119b.pp
Normal file
@ -0,0 +1,158 @@
|
||||
//{$codepage cp_acp}
|
||||
//{$codepage cp1250}
|
||||
|
||||
|
||||
program tw30119;
|
||||
//uses
|
||||
// fkdane,
|
||||
// fkrecord;
|
||||
//uses
|
||||
// cwstring;
|
||||
{$H+}
|
||||
|
||||
|
||||
type
|
||||
|
||||
rButikPtr = ^rButik;
|
||||
rButik =
|
||||
packed record
|
||||
data : word; {2}
|
||||
dowod : word; {4}
|
||||
numer : int64; {12}
|
||||
dataDost : word; {14} {w zamowieniu otwarte 00 }
|
||||
memoa, {16} { 1- dot zamowienia zamkniete 10
|
||||
2- par fisk --> WNT z importu zawieszone 01 anulowane 11
|
||||
|
||||
4- paleta pilne
|
||||
8- (nazwa zestawu) (stare :dot produkcji
|
||||
16- numer odbiorcy w tww
|
||||
32- zablokowane (stare:druga jednostkia cenaP
|
||||
64- poprano z produkcji - wyrob (stere data WZ w twn (norm numer WZ))
|
||||
128 : pole memo w tww
|
||||
|
||||
}
|
||||
vat : byte;
|
||||
towar, {18}
|
||||
dostawca, {20}
|
||||
odbiorca : word; {22}
|
||||
typ : -77..103; {23}
|
||||
ilosc, {27}
|
||||
cenaZ, {31}
|
||||
cenaS : single; {35}
|
||||
akwizytor : byte; {36}
|
||||
wolne1 : word; {38} {nr dostawy}
|
||||
cenaE : single; {42}
|
||||
|
||||
end;
|
||||
|
||||
|
||||
const
|
||||
|
||||
ntFakturaIMP = 2;
|
||||
ntKoszt = 3;
|
||||
ntWOC = 4;
|
||||
ntFI = 5;
|
||||
ntPW = 14;
|
||||
ntPrzyjecieTow = 15;
|
||||
ntFakturaExp = 25;
|
||||
ntFakturaSprz = 26;
|
||||
ntKP = 27;
|
||||
ntUslUnia = 28;
|
||||
ntfakturaUSL = 29;{ *}
|
||||
ntPzRWS = 30;
|
||||
ntFakturaSprzVat= 34;
|
||||
ntFakturaUslVat = 35; { faktura do paragonu*}
|
||||
ntZamowienieSprz= 36;
|
||||
ntDetal = 55;
|
||||
ntRW = 65;
|
||||
ntPrzesun = 66;
|
||||
ntDekompl = 67;
|
||||
ntPZO = 68;
|
||||
// ntWymiana = 69;{*}
|
||||
ntFakturaSprzDew = 69;
|
||||
ntReklamacjaVAT = 70;
|
||||
ntPZOVat = 71;
|
||||
ntBO = 77;
|
||||
ntZobowImp = 78;
|
||||
ntWZ = 79;
|
||||
ntZwrotPW = 80;
|
||||
ntKpZ = 81;
|
||||
ntKWz = 82;
|
||||
ntPZOEXP = 83;
|
||||
ntFakturaW = 84;
|
||||
|
||||
|
||||
|
||||
ntExpUnia = 98;
|
||||
ntImpUnia = 99;
|
||||
ntImpUniaM = 100;
|
||||
|
||||
|
||||
ntPZOUnia = 103;
|
||||
|
||||
var
|
||||
tab : array [0..10] of double;
|
||||
|
||||
|
||||
procedure testCaseRaw(const rr : rButik);
|
||||
var
|
||||
kwz: Double;
|
||||
begin
|
||||
kwz:=20;
|
||||
|
||||
|
||||
case rr.typ of
|
||||
ntFakturaSprz,ntFakturaSPrzVat,
|
||||
ntPzoExp,ntPzoUnia,
|
||||
ntPzoVat,ntPzo,
|
||||
|
||||
ntDetal,ntPzRWS,
|
||||
|
||||
ntExpUnia,ntFakturaEXP: begin
|
||||
tab[1]:=tab[1]+rr.ilosc;
|
||||
tab[2]:=tab[2]+kwz;
|
||||
end;
|
||||
-20..-16:
|
||||
;
|
||||
-30..-21:
|
||||
;
|
||||
ntRW : begin
|
||||
tab[4]:=tab[4]+kwz;
|
||||
end;
|
||||
|
||||
-ntFakturaIMP,
|
||||
-ntPrzyjecietow : begin
|
||||
tab[3]:=tab[3]+kwz;
|
||||
end;
|
||||
-ntBO : begin
|
||||
tab[5]:=tab[5]+kwz;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
procedure testCaseA;
|
||||
var
|
||||
r : rButik;
|
||||
begin
|
||||
// zeruj(r);
|
||||
r.ilosc:=1;
|
||||
r.cenaZ:=10;
|
||||
r.typ:=65;
|
||||
testCaseRaw(r);
|
||||
// checkEquals(10,tab[4]);
|
||||
r.typ:=-ntPrzyjecieTow;
|
||||
testCaseRaw(r);
|
||||
// checkEquals(10,tab[3]);
|
||||
r.typ:=65;
|
||||
testCaseRaw(r);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
begin
|
||||
writeln('start');
|
||||
testCaseA;
|
||||
writeln('stop') ;
|
||||
end.
|
Loading…
Reference in New Issue
Block a user