mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 06:49:23 +02:00
pastojs: fixed range check of o.aString[index]
git-svn-id: trunk@40175 -
This commit is contained in:
parent
f116d51fd9
commit
3979f9922a
@ -7431,7 +7431,10 @@ var
|
|||||||
|
|
||||||
CallEx:=CreateCallExpression(El);
|
CallEx:=CreateCallExpression(El);
|
||||||
try
|
try
|
||||||
if IsRangeCheck then
|
if IsRangeCheck
|
||||||
|
and (not (El.Parent is TBinaryExpr)
|
||||||
|
or (TBinaryExpr(El.Parent).right<>El)
|
||||||
|
or (TBinaryExpr(El.Parent).OpCode<>eopSubIdent)) then
|
||||||
begin
|
begin
|
||||||
// read s[index] -> rtl.rcCharAt(s,index-1)
|
// read s[index] -> rtl.rcCharAt(s,index-1)
|
||||||
CallEx.Expr:=CreatePrimitiveDotExpr(FBuiltInNames[pbivnRTL]+'.'+FBuiltInNames[pbifnRangeCheckGetCharAt],El);
|
CallEx.Expr:=CreatePrimitiveDotExpr(FBuiltInNames[pbivnRTL]+'.'+FBuiltInNames[pbifnRangeCheckGetCharAt],El);
|
||||||
|
@ -22422,7 +22422,8 @@ begin
|
|||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
Add([
|
Add([
|
||||||
'{$R+}',
|
'{$R+}',
|
||||||
'type TLetter = char;',
|
'type',
|
||||||
|
' TLetter = char;',
|
||||||
'var',
|
'var',
|
||||||
' b: TLetter = ''2'';',
|
' b: TLetter = ''2'';',
|
||||||
' w: TLetter = ''3'';',
|
' w: TLetter = ''3'';',
|
||||||
@ -22571,29 +22572,44 @@ procedure TTestModule.TestRangeChecks_StringIndex;
|
|||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
Add([
|
Add([
|
||||||
|
'type',
|
||||||
|
' TObject = class',
|
||||||
|
' S: string;',
|
||||||
|
' end;',
|
||||||
'{$R+}',
|
'{$R+}',
|
||||||
'procedure DoIt(var h: string);',
|
'procedure DoIt(var h: string);',
|
||||||
'var',
|
'var',
|
||||||
' s: string;',
|
' s: string;',
|
||||||
' i: longint;',
|
' i: longint;',
|
||||||
' c: char;',
|
' c: char;',
|
||||||
|
' o: tobject;',
|
||||||
'begin',
|
'begin',
|
||||||
' c:=s[1];',
|
' c:=s[1];',
|
||||||
' s[i]:=s[i];',
|
' s[i]:=s[i];',
|
||||||
' h[i]:=h[i];',
|
' h[i]:=h[i];',
|
||||||
|
' c:=o.s[i];',
|
||||||
'end;',
|
'end;',
|
||||||
'begin',
|
'begin',
|
||||||
'']);
|
'']);
|
||||||
ConvertProgram;
|
ConvertProgram;
|
||||||
CheckSource('TestRangeChecks_StringIndex',
|
CheckSource('TestRangeChecks_StringIndex',
|
||||||
LinesToStr([ // statements
|
LinesToStr([ // statements
|
||||||
|
'rtl.createClass($mod, "TObject", null, function () {',
|
||||||
|
' this.$init = function () {',
|
||||||
|
' this.S = "";',
|
||||||
|
' };',
|
||||||
|
' this.$final = function () {',
|
||||||
|
' };',
|
||||||
|
'});',
|
||||||
'this.DoIt = function (h) {',
|
'this.DoIt = function (h) {',
|
||||||
' var s = "";',
|
' var s = "";',
|
||||||
' var i = 0;',
|
' var i = 0;',
|
||||||
' var c = "";',
|
' var c = "";',
|
||||||
|
' var o = null;',
|
||||||
' c = rtl.rcc(rtl.rcCharAt(s, 0), 0, 65535);',
|
' c = rtl.rcc(rtl.rcCharAt(s, 0), 0, 65535);',
|
||||||
' s = rtl.rcSetCharAt(s, i - 1, rtl.rcCharAt(s, i - 1));',
|
' s = rtl.rcSetCharAt(s, i - 1, rtl.rcCharAt(s, i - 1));',
|
||||||
' h.set(rtl.rcSetCharAt(h.get(), i - 1, rtl.rcCharAt(h.get(), i - 1)));',
|
' h.set(rtl.rcSetCharAt(h.get(), i - 1, rtl.rcCharAt(h.get(), i - 1)));',
|
||||||
|
' c = rtl.rcc(o.S.charAt(i - 1), 0, 65535);',
|
||||||
'};',
|
'};',
|
||||||
'']),
|
'']),
|
||||||
LinesToStr([ // $mod.$main
|
LinesToStr([ // $mod.$main
|
||||||
|
Loading…
Reference in New Issue
Block a user