From 4faef09f6ac7465aaeb30cc260ba9a4a0bcc2b10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Mon, 6 Aug 2018 19:54:35 +0200 Subject: [PATCH] bug fix #982 --- NETGenerator/NETGenerator.cs | 8 +- TestSuite/CompilationSamples/PABCSystem.pas | 81 +++++++++------------ TestSuite/dynarrays4.pas | 10 +++ 3 files changed, 47 insertions(+), 52 deletions(-) create mode 100644 TestSuite/dynarrays4.pas diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 77479434b..0373dcf61 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -3901,9 +3901,9 @@ namespace PascalABCCompiler.NETGenerator else { if (rank > 1) - CreateNDimUnsizedArray(il, (ElementValues[i] as IArrayInitializer).type, helper.GetTypeReference((ElementValues[i] as IArrayInitializer).type.element_type), rank, get_sizes(ElementValues[0] as IArrayInitializer, rank), lb.LocalType.GetElementType()); + CreateNDimUnsizedArray(il, (ElementValues[i] as IArrayInitializer).type, helper.GetTypeReference((ElementValues[i] as IArrayInitializer).type.element_type), rank, get_sizes(ElementValues[i] as IArrayInitializer, rank), lb.LocalType.GetElementType()); else - CreateUnsizedArray(il, helper.GetTypeReference((ElementValues[i] as IArrayInitializer).type.element_type), (ElementValues[0] as IArrayInitializer).ElementValues.Length, lb.LocalType.GetElementType()); + CreateUnsizedArray(il, helper.GetTypeReference((ElementValues[i] as IArrayInitializer).type.element_type), (ElementValues[i] as IArrayInitializer).ElementValues.Length, lb.LocalType.GetElementType()); il.Emit(OpCodes.Stelem, ArrType); il.Emit(OpCodes.Ldloc, lb); PushIntConst(il, i); @@ -3927,7 +3927,7 @@ namespace PascalABCCompiler.NETGenerator PushIntConst(il, i); il.Emit(OpCodes.Ldelema, ti.tp); il.Emit(OpCodes.Stloc, llb); - if (ElementValues[0] is IRecordConstantNode) + if (ElementValues[i] is IRecordConstantNode) GenerateRecordInitCode(il, llb, ElementValues[i] as IRecordConstantNode); else GenerateRecordInitCode(il, llb, ElementValues[i] as IRecordInitializer, true); } @@ -4023,7 +4023,7 @@ namespace PascalABCCompiler.NETGenerator } else { - CreateUnsizedArray(il, helper.GetTypeReference((ElementValues[i] as IArrayConstantNode).type.element_type), (ElementValues[0] as IArrayConstantNode).ElementValues.Length, lb.LocalType.GetElementType()); + CreateUnsizedArray(il, helper.GetTypeReference((ElementValues[i] as IArrayConstantNode).type.element_type), (ElementValues[i] as IArrayConstantNode).ElementValues.Length, lb.LocalType.GetElementType()); il.Emit(OpCodes.Stelem, ArrType); il.Emit(OpCodes.Ldloc, lb); PushIntConst(il, i); diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index 19087ca74..220ac3d6a 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -7799,47 +7799,15 @@ begin value := Res; end; -function StrToInt64(s: string): int64; -begin - Result := Convert.ToInt64(s); -end; +function StrToInt64(s: string) := Convert.ToInt64(s); +function StrToReal(s: string) := Convert.ToDouble(s, nfi); +function StrToFloat(s: string) := StrToReal(s); -function StrToFloat(s: string): real; -begin - Result := Convert.ToDouble(s, nfi); -end; - -function StrToReal(s: string) := StrToFloat(s); - -function TryStrToInt64(s: string; var value: int64): boolean; -begin - Result := int64.TryParse(s, value); -end; - -function TryStrToFloat(s: string; var value: real): boolean; -begin - try - Result := True; - value := Convert.ToDouble(s, nfi); - except - value := 0; - Result := False; - end; -end; - -function TryStrToFloat(s: string; var value: single): boolean; -begin - try - Result := True; - value := Convert.ToSingle(s, nfi); - except - value := 0; - Result := False; - end; -end; - -function TryStrToReal(s: string; var value: real) := TryStrToFloat(s, value); -function TryStrToSingle(s: string; var value: single) := TryStrToFloat(s, value); +function TryStrToInt64(s: string; var value: int64) := int64.TryParse(s, value); +function TryStrToReal(s: string; var value: real) := real.TryParse(s,System.Globalization.NumberStyles.Float,nil,value); +function TryStrToSingle(s: string; var value: single) := single.TryParse(s,System.Globalization.NumberStyles.Float,nil,value); +function TryStrToFloat(s: string; var value: real) := TryStrToReal(s, value); +function TryStrToFloat(s: string; var value: single) := TryStrToSingle(s, value); function ReadIntegerFromString(s: string; var from: integer): integer; begin @@ -10189,21 +10157,38 @@ begin end; /// Преобразует строку в целое -function ToInteger(Self: string): integer; extensionmethod; -begin - Result := integer.Parse(Self); -end; +function ToInteger(Self: string): integer; extensionmethod := integer.Parse(Self); /// Преобразует строку в BigInteger -function ToBigInteger(Self: string): BigInteger; extensionmethod; +function ToBigInteger(Self: string): BigInteger; extensionmethod := BigInteger.Parse(Self); + +/// Преобразует строку в вещественное +function ToReal(Self: string): real; extensionmethod := real.Parse(Self, nfi); + +/// Преобразует строку в целое и записывает его в value. +///При невозможности преобразования возвращается False +function TryToInteger(Self: string; var value: integer): boolean; extensionmethod := TryStrToInt(Self,value); + +/// Преобразует строку в вещественное и записывает его в value. +///При невозможности преобразования возвращается False +function TryToReal(Self: string; var value: real): boolean; extensionmethod := TryStrToReal(Self,value); + +/// Преобразует строку в целое +///При невозможности преобразования возвращается defaultvalue +function ToInteger(Self: string; defaultvalue: integer): integer; extensionmethod; begin - Result := BigInteger.Parse(Self); + var b := TryStrToInt(Self,Result); + if not b then + Result := defaultvalue end; /// Преобразует строку в вещественное -function ToReal(Self: string): real; extensionmethod; +///При невозможности преобразования возвращается defaultvalue +function ToReal(Self: string; defaultvalue: real): real; extensionmethod; begin - Result := real.Parse(Self, nfi); + var b := TryStrToReal(Self,Result); + if not b then + Result := defaultvalue end; /// Преобразует строку в массив слов diff --git a/TestSuite/dynarrays4.pas b/TestSuite/dynarrays4.pas new file mode 100644 index 000000000..3bc63cf69 --- /dev/null +++ b/TestSuite/dynarrays4.pas @@ -0,0 +1,10 @@ +var c2: array of array of integer := ((1,2,3),(4,5),(6,7,8)); +begin + var c: array of array of integer := ((1,2,3),(4,5),(6,7,8)); + assert(c[0].Length = 3); + assert(c[1].Length = 2); + assert(c[2].Length = 3); + assert(c2[0].Length = 3); + assert(c2[1].Length = 2); + assert(c2[2].Length = 3); +end. \ No newline at end of file