Browse Source

pastojs: range check int+=

git-svn-id: trunk@38014 -
Mattias Gaertner 7 years ago
parent
commit
9ede3e245f
2 changed files with 15 additions and 3 deletions
  1. 12 3
      packages/pastojs/src/fppas2js.pp
  2. 3 0
      packages/pastojs/tests/tcmodules.pas

+ 12 - 3
packages/pastojs/src/fppas2js.pp

@@ -10870,7 +10870,6 @@ begin
       if (bsRangeChecks in AContext.ScannerBoolSwitches)
           and not (T.Expr is TJSLiteral) then
         begin
-        // LHS:=rtl.rc(RHS,min,max)
         if AssignContext.LeftResolved.BaseType in btAllJSInteger then
           begin
           if AssignContext.LeftResolved.TypeEl is TPasUnresolvedSymbolRef then
@@ -10879,8 +10878,18 @@ begin
               RaiseNotSupported(El.left,AContext,20180119154120);
             Call:=CreateCallExpression(El);
             Call.Expr:=CreatePrimitiveDotExpr(FBuiltInNames[pbivnRTL]+'.'+FBuiltInNames[pbifnRangeCheckInt],El);
-            Call.AddArg(T.Expr);
-            T.Expr:=Call;
+            if El.Kind=akDefault then
+              begin
+              // LHS:=rtl.rc(RHS,min,max)    check before assign
+              Call.AddArg(T.Expr);
+              T.Expr:=Call;
+              end
+            else
+              begin
+              // rtl.rc(LHS+=RHS,min,max)    check after assign
+              Call.AddArg(Result);
+              Result:=Call;
+              end;
             Call.AddArg(CreateLiteralNumber(El.right,MinVal));
             Call.AddArg(CreateLiteralNumber(El.right,MaxVal));
             end;

+ 3 - 0
packages/pastojs/tests/tcmodules.pas

@@ -15973,6 +15973,7 @@ end;
 
 procedure TTestModule.TestRangeChecks_Assign;
 begin
+  Scanner.Options:=Scanner.Options+[po_CAssignments];
   StartProgram(false);
   Add([
   '{$R+}',
@@ -15982,6 +15983,7 @@ begin
   'procedure DoIt;',
   'begin',
   '  b:=w;',
+  '  b+=w;',
   'end;',
   '{$R-}',
   'begin',
@@ -15996,6 +15998,7 @@ begin
     'this.w = 0;',
     'this.DoIt = function () {',
     '  $mod.b = rtl.rc($mod.w,0,255);',
+    '  rtl.rc($mod.b += $mod.w, 0, 255);',
     '};',
     '']),
     LinesToStr([ // $mod.$main