bug fix #3055
This commit is contained in:
parent
7d61b271c8
commit
a07d7bb8e5
|
|
@ -5881,6 +5881,8 @@ namespace PascalABCCompiler.NETGenerator
|
|||
bool tmp_virtual_method_call = virtual_method_call;
|
||||
virtual_method_call = false;
|
||||
value.obj.visit(this);
|
||||
if (value.obj is ICommonClassFieldReferenceNode)
|
||||
is_field_reference = true;
|
||||
virtual_method_call = tmp_virtual_method_call;
|
||||
is_addr = temp_is_addr;
|
||||
FldInfo fi_info = helper.GetField(value.field);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// Учебный модуль, реализующий базовые алгоритмы информатики (27.02.2024)
|
||||
/// Учебный модуль, реализующий базовые алгоритмы информатики (24.03.2024)
|
||||
unit School;
|
||||
|
||||
interface
|
||||
|
|
@ -218,14 +218,25 @@ function PrimeDivisorsCount(n: integer): integer;
|
|||
/// Возвращает целочисленный список расширенного представления
|
||||
/// десятичного числа n по основанию base.
|
||||
/// По умолчанию base=10 и возвращается список десятичных цифр числа n.
|
||||
/// Обратное действие выполняет функция Refold.
|
||||
/// Обратное действие выполняет функция DigitsToInt64.
|
||||
function Digits(n: int64; base: integer := 10): List<integer>;
|
||||
|
||||
/// Возвращает целочисленный список расширенного представления
|
||||
/// десятичного числа n по основанию base.
|
||||
/// По умолчанию base=10 и возвращается список десятичных цифр числа n.
|
||||
/// Обратное действие выполняют функции DigitsToInt64 и DigitsToBigInteger.
|
||||
function Digits(n: BigInteger; base: integer := 10): List<integer>;
|
||||
|
||||
/// Возвращает целое десятичное число на основе его расширенного представления
|
||||
/// по основанию base (по умолчанию base=10).
|
||||
/// Функция выполняет действие, обратное функции Digits,
|
||||
function DigitsToInt64(ext: List<integer>; base: integer := 10): int64;
|
||||
|
||||
/// Возвращает целое десятичное число на основе его расширенного представления
|
||||
/// по основанию base (по умолчанию base=10).
|
||||
/// Функция выполняет действие, обратное функции Digits,
|
||||
function DigitsToBigInteger(ext: List<integer>; base: integer := 10): BigInteger;
|
||||
|
||||
/// Возвращает список делителей натурального числа n
|
||||
function Divisors(n: integer): List<integer>;
|
||||
|
||||
|
|
@ -844,11 +855,11 @@ function PrimeDivisorsCount(Self: integer): integer; extensionmethod := PrimeDiv
|
|||
/// Возвращает целочисленный список расширенного представления
|
||||
/// десятичного числа n по основанию base.
|
||||
/// По умолчанию base=10 и возвращается список десятичных цифр числа n.
|
||||
/// Обратное действие выполняет функция Refold.
|
||||
/// Обратное действие выполняет функция DigitsToInt64.
|
||||
function Digits(n: int64; base: integer): List<integer>;
|
||||
begin
|
||||
Result := new List<integer>;
|
||||
if (n < 0) or (base < 2) then exit;
|
||||
if (n < 0) or (base < 2) or (base > integer.MaxValue) then exit;
|
||||
if n = 0 then Result := Lst(0)
|
||||
else
|
||||
while n > 0 do
|
||||
|
|
@ -866,6 +877,28 @@ function Digits(Self: integer; base: integer := 10): List<integer>;
|
|||
function Digits(Self: int64; base: integer := 10): List<integer>;
|
||||
extensionmethod := Digits(Self, base);
|
||||
|
||||
/// Возвращает целочисленный список расширенного представления
|
||||
/// десятичного числа n по основанию base.
|
||||
/// По умолчанию base=10 и возвращается список десятичных цифр числа n.
|
||||
/// Обратное действие выполняют функции DigitsToInt64 и DigitsToBigInteger.
|
||||
function Digits(n: BigInteger; base: integer): List<integer>;
|
||||
begin
|
||||
Result := new List<integer>;
|
||||
if (n < 0) or (base < 2) or (base > integer.MaxValue) then exit;
|
||||
if n = 0 then Result := Lst(0)
|
||||
else
|
||||
while n > 0 do
|
||||
begin
|
||||
var rem := integer(n mod base);
|
||||
Result.Add(rem);
|
||||
n := n div base
|
||||
end;
|
||||
Result.Reverse
|
||||
end;
|
||||
|
||||
function Digits(Self: Biginteger; base: integer := 10): List<integer>;
|
||||
extensionmethod := Digits(Self, base);
|
||||
|
||||
/// Возвращает целое десятичное число на основе его расширенного представления
|
||||
/// по основанию base (по умолчанию base=10).
|
||||
/// Функция выполняет действие, обратное функции Digits
|
||||
|
|
@ -881,7 +914,24 @@ begin
|
|||
end;
|
||||
|
||||
function DigitsToInt64(Self: List<integer>; base: integer := 10): int64;
|
||||
extensionmethod := DigitsToInt64(Self, base);
|
||||
extensionmethod := DigitsToInt64(Self, base);
|
||||
|
||||
/// Возвращает целое десятичное число на основе его расширенного представления
|
||||
/// по основанию base (по умолчанию base=10).
|
||||
/// Функция выполняет действие, обратное функции Digits,
|
||||
function DigitsToBigInteger(ext: List<integer>; base: integer): BigInteger;
|
||||
begin
|
||||
Result := BigInteger.Zero;
|
||||
var p := BigInteger.One;
|
||||
for var i := ext.Count -1 downto 0 do
|
||||
begin
|
||||
Result += ext[i] * p;
|
||||
p *= base
|
||||
end
|
||||
end;
|
||||
|
||||
function DigitsToBigInteger(Self: List<integer>; base: integer := 10): BigInteger;
|
||||
extensionmethod := DigitsToBigInteger(Self, base);
|
||||
|
||||
{$endregion}
|
||||
|
||||
|
|
|
|||
|
|
@ -308,17 +308,18 @@ begin
|
|||
Result := Self;
|
||||
end;
|
||||
|
||||
function LoadFromXaml(fname: string): object;
|
||||
function ParseXaml(s: string): object;
|
||||
begin
|
||||
var s := ReadAllText(fname);
|
||||
var context := new ParserContext();
|
||||
context.XmlnsDictionary.Add('','http://schemas.microsoft.com/winfx/2006/xaml/presentation');
|
||||
context.XmlnsDictionary.Add('x', 'http://schemas.microsoft.com/winfx/2006/xaml');
|
||||
Result := System.Windows.Markup.XamlReader.Parse(ReadAllText(fname),nil);
|
||||
Result := System.Windows.Markup.XamlReader.Parse(s,context);
|
||||
end;
|
||||
|
||||
//var s := new System.IO.FileStream(fname, System.IO.FileMode.Open);
|
||||
//Result := System.Windows.Markup.XamlReader.Load(s);
|
||||
//s.Close();
|
||||
function LoadFromXaml(fname: string): object;
|
||||
begin
|
||||
var s := ReadAllText(fname);
|
||||
Result := ParseXaml(s);
|
||||
end;
|
||||
|
||||
// Функции создания элементов управления
|
||||
|
|
|
|||
25
TestSuite/generics74.pas
Normal file
25
TestSuite/generics74.pas
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
var s: string;
|
||||
type
|
||||
// не обязательно auto класс, я добавил только ради конструктора
|
||||
t0 = auto class
|
||||
f: byte;
|
||||
end;
|
||||
|
||||
procedure p1<T>(o: T); where T: t0;
|
||||
begin
|
||||
s := o.f.ToString; // Выводит 0 вместо 123
|
||||
|
||||
// Обязательно захватить параметр и локальную переменную лямбдой
|
||||
var x := 0;
|
||||
var p := procedure->
|
||||
begin
|
||||
o := o;
|
||||
x := x;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
begin
|
||||
p1(new t0(byte(123)));
|
||||
assert(s = '123');
|
||||
end.
|
||||
Loading…
Reference in a new issue