Browse Source

pastojs: initialize integer with 0, even if this is out of range

git-svn-id: trunk@39384 -
Mattias Gaertner 7 years ago
parent
commit
967e1fd6b5

+ 15 - 8
packages/pastojs/src/fppas2js.pp

@@ -16587,11 +16587,13 @@ var
   bt: TResolverBaseType;
   JSBaseType: TPas2jsBaseType;
   C: TClass;
+  aResolver: TPas2JSResolver;
   Value: TResEvalValue;
 begin
   T:=PasType;
-  if AContext.Resolver<>nil then
-    T:=AContext.Resolver.ResolveAliasType(T);
+  aResolver:=AContext.Resolver;
+  if aResolver<>nil then
+    T:=aResolver.ResolveAliasType(T);
 
   //writeln('START TPasToJSConverter.CreateValInit PasType=',GetObjName(PasType),' El=',GetObjName(El),' T=',GetObjName(T),' Expr=',GetObjName(Expr));
   if T=nil then
@@ -16599,7 +16601,7 @@ begin
     // untyped var/const
     if Expr=nil then
       begin
-      if AContext.Resolver=nil then
+      if aResolver=nil then
         exit(CreateLiteralUndefined(El));
       RaiseInconsistency(20170415185745,El);
       end;
@@ -16625,12 +16627,17 @@ begin
   else if C=TPasSetType then
     // a "set" without initial value
     Result:=TJSObjectLiteral(CreateElement(TJSObjectLiteral,El))
-  else if (C=TPasRangeType) and (AContext.Resolver<>nil) then
-    // a custom range without initial value -> use first value
+  else if (C=TPasRangeType) and (aResolver<>nil) then
     begin
+    // a custom range without initial value
+    // -> for FPC/Delphi compatibility use 0 even if it is out of range
     Value:=AContext.Resolver.Eval(TPasRangeType(T).RangeExpr.left,[refConst]);
     try
-      Result:=ConvertConstValue(Value,AContext,El);
+      case Value.Kind of
+      revkInt,revkUInt: Result:=CreateLiteralNumber(El,0);
+      else
+        Result:=ConvertConstValue(Value,AContext,El);
+      end;
     finally
       ReleaseEvalValue(Value);
     end;
@@ -16674,12 +16681,12 @@ begin
         else
           begin
           {$IFDEF VerbosePas2JS}
-          writeln('TPasToJSConverter.CreateVarInit unknown PasType T=',GetObjName(T),' basetype=',AContext.Resolver.BaseTypeNames[bt]);
+          writeln('TPasToJSConverter.CreateVarInit unknown PasType T=',GetObjName(T),' basetype=',aResolver.BaseTypeNames[bt]);
           {$ENDIF}
           RaiseNotSupported(PasType,AContext,20170208162121);
           end;
         end
-      else if AContext.Resolver<>nil then
+      else if aResolver<>nil then
         begin
         {$IFDEF VerbosePas2JS}
         writeln('TPasToJSConverter.CreateValInit PasType=',GetObjName(PasType),' El=',GetObjName(El),' T=',GetObjName(T),' Expr=',GetObjName(Expr));

+ 1 - 1
packages/pastojs/src/pas2jsfiler.pp

@@ -7558,7 +7558,7 @@ begin
         end;
       except
         on E: Edecompressionerror do
-          RaiseMsg(20180704162214,'decompression error: '+E.Message);
+          RaiseMsg(20180704162214,'decompression error, file corrupt: '+E.Message);
       end;
       Src.Position:=0;
       end

+ 9 - 9
packages/pastojs/tests/tcmodules.pas

@@ -5221,7 +5221,7 @@ begin
     'this.MinInt = -4503599627370496;',
     'this.MaxInt = 4503599627370495;',
     'this.a = -4503599627370496 + 4503599627370495;',
-    'this.i = -4503599627370496;',
+    'this.i = 0;',
     '']),
     LinesToStr([
     '$mod.i = - -4503599627370496;',
@@ -5268,8 +5268,8 @@ begin
     'this.s4 = rtl.createSet(null, -128, 127);',
     'this.s5 = rtl.createSet(null, -128 + 1, 127 - 1);',
     'this.s6 = 1 in $mod.s2;',
-    'this.i = -1;',
-    'this.i2 = 1;',
+    'this.i = 0;',
+    'this.i2 = 0;',
     '']),
     LinesToStr([
     '$mod.i = $mod.i2;',
@@ -5524,7 +5524,7 @@ begin
     'this.a2 = rtl.arraySetLength(null, 0, 3);',
     'this.soi = {};',
     'this.soir = {};',
-    'this.ir = 3;',
+    'this.ir = 0;',
     '']),
     LinesToStr([ // this.$main
     'for (var $l1 = 0; $l1 <= 255; $l1++) $mod.i = $l1;',
@@ -20471,7 +20471,7 @@ begin
     'this.h = 1;',
     'rtl.createClass($mod, "TObject", null, function () {',
     '  this.$init = function () {',
-    '    this.FV = -1;',
+    '    this.FV = 0;',
     '  };',
     '  this.$final = function () {',
     '  };',
@@ -22091,10 +22091,10 @@ begin
     'this.DoIt = function () {',
     '  var Arr = [];',
     '  var ArrArr = [];',
-    '  var ArrByte = rtl.arraySetLength(null, 1, 256);',
-    '  var ArrChar = rtl.arraySetLength(null, 1, 10);',
-    '  var ArrByteChar = rtl.arraySetLength(null, 1, 256, 10);',
-    '  var i = 1;',
+    '  var ArrByte = rtl.arraySetLength(null, 0, 256);',
+    '  var ArrChar = rtl.arraySetLength(null, 0, 10);',
+    '  var ArrByteChar = rtl.arraySetLength(null, 0, 256, 10);',
+    '  var i = 0;',
     '  var c = "";',
     '  i = rtl.rc(Arr[1], 1, 10);',
     '  i = rtl.rc(ArrByteChar[1][2], 1, 10);',