pastojs: fixed range check of o.aString[index]

git-svn-id: trunk@40175 -
This commit is contained in:
Mattias Gaertner 2018-11-02 00:06:29 +00:00
parent f116d51fd9
commit 3979f9922a
2 changed files with 21 additions and 2 deletions

View File

@ -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);

View File

@ -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