From 443ed6d3d71d4e8985bb0bacc40b5750d63ed33a Mon Sep 17 00:00:00 2001 From: Mikhalkovich Stanislav Date: Tue, 7 May 2024 12:19:23 +0300 Subject: [PATCH] =?UTF-8?q?ObjectToString=20-=20=D1=83=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=BE=D0=B4=D1=87=D0=B5=D1=80=D0=BA=D0=B8=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20TypeName=20-=20=D1=83=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=B0=D1=80=D1=82=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D1=8B=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=B2=20implementation=20=D0=B8=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=8B,=20=D1=8D=D1=82=D0=BE=20=D0=B8=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D1=83=D1=8E=D1=89=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 4 +- .../PascalABCParserNewSaushkin/ABCPascal.cs | 6 +- .../ABCPascalYacc.cs | 2 +- Parsers/PascalABCParserNewSaushkin/PABC.ymc | 1 + Release/pabcversion.txt | 2 +- ReleaseGenerators/PascalABCNET_version.nsh | 2 +- TestSuite/CompilationSamples/GraphABC.pas | 2 +- TestSuite/CompilationSamples/LightPT.pas | 2 +- TestSuite/CompilationSamples/OpenCLABC.pas | 4 +- TestSuite/CompilationSamples/PABCSystem.pas | 104 ++++++++--------- TestSuite/ObjectToString.pas | 106 ------------------ TestSuite/ObjectToString.txt | 32 ------ TestSuite/ObjectToStringExt.cs | 14 --- TestSuite/ObjectToStringExt.dll | Bin 3072 -> 0 bytes bin/Lib/GraphABC.pas | 2 +- bin/Lib/LightPT.pas | 2 +- bin/Lib/OpenCLABC.pas | 4 +- bin/Lib/PABCSystem.pas | 30 +++-- bin/Lib/PABCSystem.xml | 20 ++-- 20 files changed, 87 insertions(+), 254 deletions(-) delete mode 100644 TestSuite/ObjectToString.pas delete mode 100644 TestSuite/ObjectToString.txt delete mode 100644 TestSuite/ObjectToStringExt.cs delete mode 100644 TestSuite/ObjectToStringExt.dll diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 70d5c51ea..c8a176184 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "9"; public const string Build = "0"; - public const string Revision = "3474"; + public const string Revision = "3477"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index 472ec20c1..ef73f4c55 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%COREVERSION%=0 -%REVISION%=3474 %MINOR%=9 +%REVISION%=3477 +%COREVERSION%=0 %MAJOR%=3 diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs index b621ec7f2..903d9f72c 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs @@ -2,7 +2,7 @@ // This CSharp output file generated by Gardens Point LEX // Version: 1.1.3.301 // Machine: DESKTOP-G8V08V4 -// DateTime: 05.05.2024 20:08:13 +// DateTime: 07.05.2024 10:51:36 // UserName: ????????? // GPLEX input file // GPLEX frame file @@ -2185,7 +2185,7 @@ if (parserTools.buildTreeForFormatter) parserTools.ParseDirective(yytext, CurrentLexLocation, out var directiveName, out var directiveParams); var orgDirectiveName = directiveName; - if (directiveName == null) // сл�?�?ай п�?с�?ой ди�?ек�?ив�? + if (directiveName == null) // слÑ?Ñ?ай пÑ?сÑ?ой диÑ?екÑ?ивÑ? break; parserTools.CheckDirectiveParams(directiveName, directiveParams, CurrentLexLocation); @@ -2283,7 +2283,7 @@ BEGIN(INITIAL); parserTools.ParseDirective(yytext, CurrentLexLocation, out directiveName, out directiveParams); orgDirectiveName = directiveName; - if (directiveName == null) // сл�?�?ай п�?с�?ой ди�?ек�?ив�? + if (directiveName == null) // слÑ?Ñ?ай пÑ?сÑ?ой диÑ?екÑ?ивÑ? break; parserTools.CheckDirectiveParams(directiveName, directiveParams, CurrentLexLocation); diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs index d0cb14138..75956ef88 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs @@ -2,7 +2,7 @@ // GPPG version 1.3.6 // Machine: DESKTOP-G8V08V4 -// DateTime: 05.05.2024 20:08:14 +// DateTime: 07.05.2024 10:51:37 // UserName: ????????? // Input file diff --git a/Parsers/PascalABCParserNewSaushkin/PABC.ymc b/Parsers/PascalABCParserNewSaushkin/PABC.ymc index 6b557701c..6a0407ca1 100644 --- a/Parsers/PascalABCParserNewSaushkin/PABC.ymc +++ b/Parsers/PascalABCParserNewSaushkin/PABC.ymc @@ -377,5 +377,6 @@ script= + diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index 87db152e9..433b0dcfd 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.9.0.3474 +3.9.0.3477 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index c8effd69e..2f1ce74a3 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.9.0.3474' +!define VERSION '3.9.0.3477' diff --git a/TestSuite/CompilationSamples/GraphABC.pas b/TestSuite/CompilationSamples/GraphABC.pas index 8d70688ec..970f5802e 100644 --- a/TestSuite/CompilationSamples/GraphABC.pas +++ b/TestSuite/CompilationSamples/GraphABC.pas @@ -1399,7 +1399,7 @@ procedure IOGraphABCSystem.write(obj: object); end; begin - var s := _ObjectToString(obj); + var s := ObjectToString(obj); lock f do begin //var fnt := GraphABC.Font.NETFont; diff --git a/TestSuite/CompilationSamples/LightPT.pas b/TestSuite/CompilationSamples/LightPT.pas index c5eb01202..ff07d668f 100644 --- a/TestSuite/CompilationSamples/LightPT.pas +++ b/TestSuite/CompilationSamples/LightPT.pas @@ -2910,7 +2910,7 @@ type begin if TestMode = tmNone then inherited write(obj); - OutputString += _ObjectToString(obj); + OutputString += ObjectToString(obj); OutputList += obj; CreateNewLineBeforeMessage := True; end; diff --git a/TestSuite/CompilationSamples/OpenCLABC.pas b/TestSuite/CompilationSamples/OpenCLABC.pas index 4d4855ed9..4026550cf 100644 --- a/TestSuite/CompilationSamples/OpenCLABC.pas +++ b/TestSuite/CompilationSamples/OpenCLABC.pas @@ -2486,7 +2486,7 @@ type sb += '{ '; end; if rt<>nil then - sb.Append(_ObjectToString(val)) else + sb.Append(ObjectToString(val)) else sb += 'nil'; if typeof(T) <> rt then sb += ' }'; @@ -2516,7 +2516,7 @@ type begin if d.Target<>nil then begin - sb += _ObjectToString(d.Target); + sb += ObjectToString(d.Target); sb += ' => '; end; var mi := d.Method; diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index 86781eaeb..82493f723 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -1506,19 +1506,11 @@ function EnumerateDirectories(path: string): sequence of string; /// Возвращает последовательность имен каталогов по заданному пути, включая подкаталоги function EnumerateAllDirectories(path: string): sequence of string; -/// Возвращает имя отражённого типа "t" +/// Возвращает строку с именем данного типа function TypeToTypeName(t: System.Type): string; -/// Добавляет в res имя отражённого типа "t" -procedure TypeToTypeName(t: System.Type; res: StringBuilder); -/// Записывает в res имя отражённого типа "t" -procedure TypeToTypeName(t: System.Type; res: TextWriter); -/// Возвращает имя типа объекта "o" -function TypeName(o: object): string; -/// Добавляет в res имя типа объекта "o" -procedure TypeName(o: object; res: StringBuilder); -/// Записывает в res имя типа объекта "o" -procedure TypeName(o: object; res: TextWriter); +/// Возвращает строку с именем типа объекта +function TypeName(obj: object): string; ///-procedure New(var p: ^T); /// Выделяет динамическую память размера sizeof(T) и возвращает в переменной p указатель на нее. Тип T должен быть размерным @@ -2675,12 +2667,8 @@ function RuntimeInitialize(kind: byte; variable: object): object; ///Вычисление размера типа на этапе выполнения function GetRuntimeSize: integer; -/// Возвращает строку для вывода подобного Write -function _ObjectToString(o: object): string; -/// Добавляет в res строку для вывода подобного Write -procedure _ObjectToString(o: object; res: StringBuilder); -/// Записывает в res строку для вывода подобного Write -procedure _ObjectToString(o: object; res: TextWriter); +/// Преобразует объект в строковое представление +function ObjectToString(obj: object): string; function IsUnix: boolean; ///-- @@ -4175,9 +4163,11 @@ procedure operator+=(var left: StringBuilder; right: string); extensionmethod := function operator implicit(s: string): StringBuilder; extensionmethod := new StringBuilder(s); //------------------------------------------------------------------------------ -// _ObjectToString +// ObjectToString //------------------------------------------------------------------------------ +procedure TypeToTypeNameHelper(t: System.Type; res: TextWriter); forward; + type ObjectToStringUtils = static class @@ -4219,7 +4209,7 @@ type res.Write( name ); res.Write(': '); end; - TypeToTypeName(par.ParameterType, res); + TypeToTypeNameHelper(par.ParameterType, res); end; res.Write(')'); end; @@ -4227,14 +4217,15 @@ type if rt<>nil then begin res.Write(': '); - TypeToTypeName(rt, res); + TypeToTypeNameHelper(rt, res); end; end; private static empty_obj_arr := new object[0]; + public static procedure ContentsToString(o: Object; prev: Stack; res: TextWriter); - const val_sep = '; '; + const val_sep = '; '; begin res.Write('('); var any_vals := false; @@ -4299,10 +4290,10 @@ type prev.Push(o); AppendImpl(o, prev, res); if prev.Pop<>o then raise new InvalidOperationException; - end; + public static procedure AppendImpl(o: Object; prev: Stack; res: TextWriter); - const max_seq_len = 100; + const max_seq_len = 100; begin if o = nil then begin @@ -4484,9 +4475,7 @@ type {$endregion IEnumerable} ContentsToString(o, prev, res); - end; - end; function TryWriteFromTypeCode(t: System.Type; res: TextWriter): boolean; @@ -4522,7 +4511,7 @@ begin end; end; -procedure TypeToTypeName(t: System.Type; res: TextWriter); +procedure TypeToTypeNameHelper(t: System.Type; res: TextWriter); begin if t=nil then begin @@ -4546,7 +4535,7 @@ begin if rank<1 then raise new NotImplementedException; res.Write(' of '); - TypeToTypeName(t.GetElementType, res); + TypeToTypeNameHelper(t.GetElementType, res); exit; end; @@ -4562,7 +4551,7 @@ begin ) then begin res.Write('sequence of '); - TypeToTypeName(typed.GetGenericArguments.Single, res); + TypeToTypeNameHelper(typed.GetGenericArguments.Single, res); exit; end; end; @@ -4579,7 +4568,7 @@ begin if any_gen_arg then res.Write(', ') else any_gen_arg := true; - TypeToTypeName(arg, res); + TypeToTypeNameHelper(arg, res); end; res.Write(')'); exit; @@ -4627,7 +4616,7 @@ begin gen_args := own_args; end; - TypeToTypeName(parent, res); + TypeToTypeNameHelper(parent, res); res.Write('+'); end; @@ -4641,7 +4630,7 @@ begin if any_gen_arg then res.Write(', ') else any_gen_arg := true; - TypeToTypeName(arg, res); + TypeToTypeNameHelper(arg, res); end; res.Write('>'); exit; @@ -4653,12 +4642,13 @@ begin if t.IsGenericParameter then res.Write(']'); end; -procedure TypeToTypeName(t: System.Type; res: StringBuilder) := - TypeToTypeName(t, new StringWriter(res)); -procedure TypeName(o: object; res: TextWriter); +procedure TypeToTypeNameHelper(t: System.Type; res: StringBuilder) := + TypeToTypeNameHelper(t, new StringWriter(res)); + +procedure TypeNameHelper(obj: object; res: TextWriter); begin - var t := o?.GetType; + var t := obj?.GetType; // Зачем? TypeName(@a) не работает // Можно сделать TypeName волшебной функцией, вызывая @@ -4672,37 +4662,39 @@ begin var static_arr_field := t?.GetField('NullBasedArray'); if static_arr_field<>nil then begin - TypeName(static_arr_field.GetValue(o), res); + TypeNameHelper(static_arr_field.GetValue(obj), res); exit; end; - TypeToTypeName(t, res); + TypeToTypeNameHelper(t, res); +end; + +procedure TypeNameHelper(obj: object; res: StringBuilder) := TypeNameHelper(obj, new StringWriter(res)); + +function TypeName(obj: object): string; +begin + var res := new StringBuilder; + TypeNameHelper(obj, res); + Result := res.ToString; end; -procedure TypeName(o: object; res: StringBuilder) := - TypeName(o, new StringWriter(res)); function TypeToTypeName(t: System.Type): string; begin var res := new StringBuilder; - TypeToTypeName(t, res); + TypeToTypeNameHelper(t, res); Result := res.ToString; end; -function TypeName(o: object): string; -begin - var res := new StringBuilder; - TypeName(o, res); - Result := res.ToString; -end; - -procedure _ObjectToString(o: object; res: TextWriter) := +procedure _ObjectToStringHelper(o: object; res: TextWriter) := ObjectToStringUtils.Append(o, new Stack, res); -procedure _ObjectToString(o: object; res: StringBuilder) := - _ObjectToString(o, new StringWriter(res)); -function _ObjectToString(o: object): string; + +procedure _ObjectToStringHelper(o: object; res: StringBuilder) := + _ObjectToStringHelper(o, new StringWriter(res)); + +function ObjectToString(obj: object): string; begin var res := new StringBuilder; - _ObjectToString(o, res); + _ObjectToStringHelper(obj, res); Result := res.ToString; end; @@ -6283,7 +6275,7 @@ procedure IOStandardSystem.write(obj: object); begin if not console_alloc then AllocConsole; - Console.Write(_ObjectToString(obj)); + Console.Write(ObjectToString(obj)); end; procedure IOStandardSystem.write(p: pointer); @@ -7526,7 +7518,7 @@ begin if f.sw = nil then raise new System.IO.IOException(GetTranslation(FILE_NOT_OPENED_FOR_WRITING)); - f.sw.Write(_ObjectToString(val)); + f.sw.Write(ObjectToString(val)); {if val = nil then begin f.sw.Write('nil'); @@ -11751,7 +11743,7 @@ begin for var j := 0 to Self.ColCount - 1 do begin if PrintMatrixWithFormat then - Write(_ObjectToString(Self[i, j]).PadLeft(w)) + Write(ObjectToString(Self[i, j]).PadLeft(w)) else Print(Self[i, j]); end; Writeln; @@ -14526,7 +14518,7 @@ end; function FormatValue(value: object; NumOfChars: integer): string; begin if value <> nil then - Result := _ObjectToString(value) + Result := ObjectToString(value) else Result := 'nil'; Result := Result.PadLeft(NumOfChars); diff --git a/TestSuite/ObjectToString.pas b/TestSuite/ObjectToString.pas deleted file mode 100644 index 369677779..000000000 --- a/TestSuite/ObjectToString.pas +++ /dev/null @@ -1,106 +0,0 @@ -type - r1 = record - public a := 123; - public b := 'abc'; - internal c := 'err'; - - public property p: byte read byte(a); - internal property e: string read 'err'; - - private function raise_getter: byte; - begin - Result := 0; - raise new Exception('Expected Exception'); - end; - public property f: byte read raise_getter; - - end; - - Base = class end; - Derived = class(Base) end; - -var res := new StringBuilder; -procedure TestO(o: object); -begin - TypeName(o, res); - res.Append('{ '); - _ObjectToString(o, res); - res.Append(' }'#10); -end; -procedure TestT(t: System.Type); -begin - TypeToTypeName(t, res); - res.Append(#10); -end; - -begin - - TestO(1); - TestO('abc'); // typeof(string).IsPrimitive=false, но Type.GetTypeCode работает - TestO(new System.UIntPtr(123)); // Выводим только UIntPtr, без пространства имён - TestO(System.ConsoleColor.Cyan); // Type.GetTypeCode возвращает integer - это надо явно обходить - TestO(Lst(0).GetEnumerator); // Вложенный тип - - // Картежи - TestO(System.Tuple.Create(1,2.3)); - TestO(System.ValueTuple.Create(1,2.3)); // Сейчас ValueTuple не обрабатывает - - // Последовательности - TestO(new byte[2,1,1,1,1,1,1,1,2]); - TestO(new byte[2,1,1,1,0,1,1,1,2]); // 0 элементов - TestO(|1.2,3|.ToList); // Элементы real, потому что у 1 из них есть вещественная часть - TestO(|1.2,3|.ToHashSet); // Мноежства выводятся в {} - TestO(|1,2,3,4,5|.Skip(1).Take(3)); // C# yield последовательность - TestO(|1,2,3,4,5|.AdjacentGroup); // Паскалевская yield последовательность - TestO(new System.Collections.ArrayList(|6,7,8|)); // Вывод содержимого НЕ типизированной последовательности - - // Тип не реализует последовательность - а является ею - TestO(|Seq(0)|); - TestO(|Seq(0) as System.Collections.IEnumerable|); - - // Сложная структура со свойствами - TestO(new r1); - - // Содержимое ссылок на функции - var d1 := procedure(b: byte)->exit(); - var d2: Action := d1; - var d3 := function: object->d1; - var d4: Func0 := d3; - TestO(d1); - TestO(d2); // Преобразование к содержимому типу делегата - TestO(Delegate(d3)); // Захват переменной - TestO(Delegate(d4)); // Два предыдущих вместе - TestO(Arr(d1)); // Внутри массива - TestO(Arr&(d1)); // Тип элементов массива абстрактный, поэтому у него нету .Invoke - - // Генерики - TestT(typeof(Dictionary<,>)); // Не подставленные параметры в [], т.е. [TKey] - TestT(typeof(Derived).BaseType); // Сложная подстановка типов - TestT(typeof(Derived<>).BaseType); // Только часть типов подставлена - TestT(Lst(0).GetType.GetGenericTypeDefinition); - TestT(Lst(0).GetEnumerator.GetType.GetGenericTypeDefinition); // Вложенный тип без подстановки - - // Особый генерик, подобный не существует нигде в стандартной библиотеке .Net - begin - {$reference ObjectToStringExt.dll} - var t := typeof(OTS.CS.Parent<>).GetNestedTypes.Single; - TestT(t); - TestT(t.MakeGenericType(typeof(byte), typeof(word))); - TestT(t.MakeGenericType(typeof(byte), t.GetGenericArguments[1])); - TestT(t.MakeGenericType(t.GetGenericArguments[0], typeof(word))); - end; - - var otp_fname := 'ObjectToString.txt'; - var otp_new_fname := 'ObjectToString[new].txt'; - var enc := new System.Text.UTF8Encoding(true); - - var dir := GetCurrentDir; - if System.IO.Path.GetFileName(dir)='exe' then - dir := System.IO.Path.GetDirectoryName(dir); - - var expected := ReadAllText(dir+'\'+otp_fname, enc).Remove(#13); - var curr := res.ToString.RegexReplace('(?<=Exception:[^\n]*)\r?\n(?:(?!(?+Enumerator{ (Current=0) } -(integer, real){ (1, 2.3) } -ValueTuple{ (1, 2.3) } -array[,,,,,,,,] of byte{ [[[[[[[[[0,0]]]]]]]],[[[[[[[[0,0]]]]]]]]] } -array[,,,,,,,,] of byte{ [[[[[[[[[]]]]]]]]] } -List{ [1.2,3] } -HashSet{ {1.2,3} } -sequence of integer{ [2,3,4] } -sequence of array of integer{ [[1],[2],[3],[4],[5]] } -ArrayList{ [6,7,8] } -array of sequence of integer{ [[0]] } -array of IEnumerable{ [[0]] } -r1{ (a=123; b=abc; p=123; f=System.Exception: Expected Exception) } -procedure(byte){ procedure lambda(b: byte) } -procedure(byte){ procedure lambda(b: byte) => procedure Invoke(b: byte) } -function: Object{ (d1=procedure lambda(b: byte)) => function lambda: Object } -function: Object{ (d1=procedure lambda(b: byte)) => function lambda: Object => function Invoke: Object } -array of procedure(byte){ [procedure lambda(b: byte)] } -array of MulticastDelegate{ [procedure lambda(b: byte)] } -Dictionary<[TKey], [TValue]> -Base -Base<[T], array of [T], word> -List<[T]> -List<[T]>+Enumerator -Parent<[T1]>+Nested<[T2]> -Parent+Nested -Parent+Nested<[T2]> -Parent<[T1]>+Nested diff --git a/TestSuite/ObjectToStringExt.cs b/TestSuite/ObjectToStringExt.cs deleted file mode 100644 index 8f4be4cd1..000000000 --- a/TestSuite/ObjectToStringExt.cs +++ /dev/null @@ -1,14 +0,0 @@ - - - -namespace OTS.CS { - - public class Parent { - - public class Nested { } - - } - -} - - diff --git a/TestSuite/ObjectToStringExt.dll b/TestSuite/ObjectToStringExt.dll deleted file mode 100644 index 0dad4c12d55e2b3b29446950b8655e7bdf4fad27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3072 zcmeHJO=uit7=C86iJR2a25V?2=rpNNMTSkYf`aHK*=l(y;17aG5fSvD77KdxpjZl?^}zIEb;v3To5dD98aX5iNYyJ1#s z&+{X*qRgP>nT}@`R!U~WuPJMEbmU}`dbJ2F8Uxro`uyeYYPT_I9x}2qsG->U`4mT! zU!EUuM9Zl-L=1voQ-_>(p#kLIkx=>VjfpBI(jxP&h>!<NhZN{C1+)=ne5E;i;{Q{ zF1g8trrrWR;FuP<6a|h~4<+I%amc<-oiE{I%Ce19XU{JbI9{i|DEgf1S2zmMWSl(; z3`>9hHfAs$*D**{+DyOBC$iMn{X_@e);chRGq_29S@YBQ8js;O`iJlbKGTsCnoDH{ zF^yspPiQ$sP4J4A!m24@?;g9xnZ`bC7}sbUBOk&9`3RoTvV}v`Ej-Sg7LH>U=?;_Z zp*z%Ml`b9OT%iG7pZKIM!7KP=WE+6;G?rBusoKUgR_#D}5ry(;ytL%kTCRE-E9H_k zUqU0S`hn|IP*9aty>3@rH5+kHDy>Li-fuJ=*Nz7E>ueH3$X($P!tKzs$ zwB7TrRJK$#D*N#k7u%6lb6u3SiK+ps8u>w@SOv$fdwv)>)v#+yQd=N+GXksL&% z^mt=^?LVpSN10xm){uT15#xMnF@2lFtTp$t4nM8 zfvbn8>O9Ro>zItq@)Y%A*BKiyx`!ppd*1uxO&e#tR1@h~kJw%I%SMB`{H>~Bi&B;T zGArt@poliD7HXU!Z|fAqVb!;*g`iPeGnk$K2x*=nil then - sb.Append(_ObjectToString(val)) else + sb.Append(ObjectToString(val)) else sb += 'nil'; if typeof(T) <> rt then sb += ' }'; @@ -2516,7 +2516,7 @@ type begin if d.Target<>nil then begin - sb += _ObjectToString(d.Target); + sb += ObjectToString(d.Target); sb += ' => '; end; var mi := d.Method; diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index 03bd09a85..82493f723 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -2667,12 +2667,8 @@ function RuntimeInitialize(kind: byte; variable: object): object; ///Вычисление размера типа на этапе выполнения function GetRuntimeSize: integer; -/// Возвращает строку для вывода подобного Write -function _ObjectToString(o: object): string; -/// Добавляет в res строку для вывода подобного Write -procedure _ObjectToString(o: object; res: StringBuilder); -/// Записывает в res строку для вывода подобного Write -procedure _ObjectToString(o: object; res: TextWriter); +/// Преобразует объект в строковое представление +function ObjectToString(obj: object): string; function IsUnix: boolean; ///-- @@ -4167,7 +4163,7 @@ procedure operator+=(var left: StringBuilder; right: string); extensionmethod := function operator implicit(s: string): StringBuilder; extensionmethod := new StringBuilder(s); //------------------------------------------------------------------------------ -// _ObjectToString +// ObjectToString //------------------------------------------------------------------------------ procedure TypeToTypeNameHelper(t: System.Type; res: TextWriter); forward; @@ -4689,14 +4685,16 @@ begin Result := res.ToString; end; -procedure _ObjectToString(o: object; res: TextWriter) := +procedure _ObjectToStringHelper(o: object; res: TextWriter) := ObjectToStringUtils.Append(o, new Stack, res); -procedure _ObjectToString(o: object; res: StringBuilder) := - _ObjectToString(o, new StringWriter(res)); -function _ObjectToString(o: object): string; + +procedure _ObjectToStringHelper(o: object; res: StringBuilder) := + _ObjectToStringHelper(o, new StringWriter(res)); + +function ObjectToString(obj: object): string; begin var res := new StringBuilder; - _ObjectToString(o, res); + _ObjectToStringHelper(obj, res); Result := res.ToString; end; @@ -6277,7 +6275,7 @@ procedure IOStandardSystem.write(obj: object); begin if not console_alloc then AllocConsole; - Console.Write(_ObjectToString(obj)); + Console.Write(ObjectToString(obj)); end; procedure IOStandardSystem.write(p: pointer); @@ -7520,7 +7518,7 @@ begin if f.sw = nil then raise new System.IO.IOException(GetTranslation(FILE_NOT_OPENED_FOR_WRITING)); - f.sw.Write(_ObjectToString(val)); + f.sw.Write(ObjectToString(val)); {if val = nil then begin f.sw.Write('nil'); @@ -11745,7 +11743,7 @@ begin for var j := 0 to Self.ColCount - 1 do begin if PrintMatrixWithFormat then - Write(_ObjectToString(Self[i, j]).PadLeft(w)) + Write(ObjectToString(Self[i, j]).PadLeft(w)) else Print(Self[i, j]); end; Writeln; @@ -14520,7 +14518,7 @@ end; function FormatValue(value: object; NumOfChars: integer): string; begin if value <> nil then - Result := _ObjectToString(value) + Result := ObjectToString(value) else Result := 'nil'; Result := Result.PadLeft(NumOfChars); diff --git a/bin/Lib/PABCSystem.xml b/bin/Lib/PABCSystem.xml index 764aee00c..68a9c9867 100644 --- a/bin/Lib/PABCSystem.xml +++ b/bin/Lib/PABCSystem.xml @@ -1141,19 +1141,19 @@ -- - + -- - + -- - + -- - + -- - + -- @@ -2626,14 +2626,8 @@ Вычисление размера типа на этапе выполнения - - Возвращает строку для вывода подобного Write - - - Добавляет в res строку для вывода подобного Write - - - Записывает в res строку для вывода подобного Write + + Преобразует объект в строковое представление --