This commit is contained in:
Бондарев Иван 2018-08-06 19:54:35 +02:00
parent c2b0392cbe
commit 4faef09f6a
3 changed files with 47 additions and 52 deletions

View file

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

View file

@ -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;
/// Преобразует строку в массив слов

10
TestSuite/dynarrays4.pas Normal file
View file

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