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;
|
bool tmp_virtual_method_call = virtual_method_call;
|
||||||
virtual_method_call = false;
|
virtual_method_call = false;
|
||||||
value.obj.visit(this);
|
value.obj.visit(this);
|
||||||
|
if (value.obj is ICommonClassFieldReferenceNode)
|
||||||
|
is_field_reference = true;
|
||||||
virtual_method_call = tmp_virtual_method_call;
|
virtual_method_call = tmp_virtual_method_call;
|
||||||
is_addr = temp_is_addr;
|
is_addr = temp_is_addr;
|
||||||
FldInfo fi_info = helper.GetField(value.field);
|
FldInfo fi_info = helper.GetField(value.field);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/// Учебный модуль, реализующий базовые алгоритмы информатики (27.02.2024)
|
/// Учебный модуль, реализующий базовые алгоритмы информатики (24.03.2024)
|
||||||
unit School;
|
unit School;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
@ -218,14 +218,25 @@ function PrimeDivisorsCount(n: integer): integer;
|
||||||
/// Возвращает целочисленный список расширенного представления
|
/// Возвращает целочисленный список расширенного представления
|
||||||
/// десятичного числа n по основанию base.
|
/// десятичного числа n по основанию base.
|
||||||
/// По умолчанию base=10 и возвращается список десятичных цифр числа n.
|
/// По умолчанию base=10 и возвращается список десятичных цифр числа n.
|
||||||
/// Обратное действие выполняет функция Refold.
|
/// Обратное действие выполняет функция DigitsToInt64.
|
||||||
function Digits(n: int64; base: integer := 10): List<integer>;
|
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).
|
/// по основанию base (по умолчанию base=10).
|
||||||
/// Функция выполняет действие, обратное функции Digits,
|
/// Функция выполняет действие, обратное функции Digits,
|
||||||
function DigitsToInt64(ext: List<integer>; base: integer := 10): int64;
|
function DigitsToInt64(ext: List<integer>; base: integer := 10): int64;
|
||||||
|
|
||||||
|
/// Возвращает целое десятичное число на основе его расширенного представления
|
||||||
|
/// по основанию base (по умолчанию base=10).
|
||||||
|
/// Функция выполняет действие, обратное функции Digits,
|
||||||
|
function DigitsToBigInteger(ext: List<integer>; base: integer := 10): BigInteger;
|
||||||
|
|
||||||
/// Возвращает список делителей натурального числа n
|
/// Возвращает список делителей натурального числа n
|
||||||
function Divisors(n: integer): List<integer>;
|
function Divisors(n: integer): List<integer>;
|
||||||
|
|
||||||
|
|
@ -844,11 +855,11 @@ function PrimeDivisorsCount(Self: integer): integer; extensionmethod := PrimeDiv
|
||||||
/// Возвращает целочисленный список расширенного представления
|
/// Возвращает целочисленный список расширенного представления
|
||||||
/// десятичного числа n по основанию base.
|
/// десятичного числа n по основанию base.
|
||||||
/// По умолчанию base=10 и возвращается список десятичных цифр числа n.
|
/// По умолчанию base=10 и возвращается список десятичных цифр числа n.
|
||||||
/// Обратное действие выполняет функция Refold.
|
/// Обратное действие выполняет функция DigitsToInt64.
|
||||||
function Digits(n: int64; base: integer): List<integer>;
|
function Digits(n: int64; base: integer): List<integer>;
|
||||||
begin
|
begin
|
||||||
Result := new List<integer>;
|
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)
|
if n = 0 then Result := Lst(0)
|
||||||
else
|
else
|
||||||
while n > 0 do
|
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>;
|
function Digits(Self: int64; base: integer := 10): List<integer>;
|
||||||
extensionmethod := Digits(Self, base);
|
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).
|
/// по основанию base (по умолчанию base=10).
|
||||||
/// Функция выполняет действие, обратное функции Digits
|
/// Функция выполняет действие, обратное функции Digits
|
||||||
|
|
@ -881,7 +914,24 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function DigitsToInt64(Self: List<integer>; base: integer := 10): int64;
|
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}
|
{$endregion}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -308,17 +308,18 @@ begin
|
||||||
Result := Self;
|
Result := Self;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LoadFromXaml(fname: string): object;
|
function ParseXaml(s: string): object;
|
||||||
begin
|
begin
|
||||||
var s := ReadAllText(fname);
|
|
||||||
var context := new ParserContext();
|
var context := new ParserContext();
|
||||||
context.XmlnsDictionary.Add('','http://schemas.microsoft.com/winfx/2006/xaml/presentation');
|
context.XmlnsDictionary.Add('','http://schemas.microsoft.com/winfx/2006/xaml/presentation');
|
||||||
context.XmlnsDictionary.Add('x', 'http://schemas.microsoft.com/winfx/2006/xaml');
|
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);
|
function LoadFromXaml(fname: string): object;
|
||||||
//Result := System.Windows.Markup.XamlReader.Load(s);
|
begin
|
||||||
//s.Close();
|
var s := ReadAllText(fname);
|
||||||
|
Result := ParseXaml(s);
|
||||||
end;
|
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