This commit is contained in:
Mikhalkovich Stanislav 2021-01-05 21:35:47 +03:00
commit d391efc968
60 changed files with 26212 additions and 26228 deletions

38
.github/workflows/buildandruntests.yml vendored Normal file
View file

@ -0,0 +1,38 @@
name: Build & Run all tests (release)
on:
workflow_dispatch:
release:
types:
- created
defaults:
run:
shell: cmd
jobs:
build:
name: Prepare and build on Windows Server 2016 VM
runs-on: windows-2016
steps:
- uses: actions/checkout@v2
- name: Install dependencies into Virtual Environment...
run: _RegisterHelixNUnit.bat
- name: Build project in Release-mode, compile Pas-units, run tests
run: _RebuildReleaseAndRunTestsForGitHubActions.bat
timeout-minutes: 40
env:
PABCNET_BUILD_MODE: Release
PABCNET_RUN_TESTS: false
PABCNET_INC_BUILD: false
PABCNET_VERBOSE: false
#- name: Publish artifacts (5/5)...
# uses: actions/upload-artifact@v2
# with:
# name: All_distros
# path: Release

View file

@ -12,7 +12,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CodeCompletion")]
[assembly: AssemblyCopyright("Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyCopyright("Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

View file

@ -2211,6 +2211,10 @@ namespace PascalABCCompiler.PCU
ctn.type_special_kind = tsk;
if (ctn.full_name == "PABCSystem.BinaryFile")
ctn.type_special_kind = SemanticTree.type_special_kind.binary_file;
if (ctn.type_special_kind != SemanticTree.type_special_kind.set_type)
{
SystemLibrary.SystemLibrary.init_reference_type(ctn);
}
if (type_is_generic_definition)
{
foreach (common_type_node par in type_params)
@ -2219,14 +2223,11 @@ namespace PascalABCCompiler.PCU
ReadTypeParameterEliminations(par);
}
}
type_node elemnet_type = null;
type_node element_type = null;
if (CanReadObject())
elemnet_type = GetTypeReference();
ctn.element_type = elemnet_type;
if (ctn.type_special_kind != SemanticTree.type_special_kind.set_type)
{
SystemLibrary.SystemLibrary.init_reference_type(ctn);
}
element_type = GetTypeReference();
ctn.element_type = element_type;
if (ctn.type_special_kind == SemanticTree.type_special_kind.set_type)
{
ctn = compilation_context.AddTypeToSetTypeList(ctn);

View file

@ -9,7 +9,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Localization")]
[assembly: AssemblyCopyright("Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyCopyright("Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

View file

@ -5,7 +5,7 @@ using System.Runtime.CompilerServices;
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PascalABC.NET Compiler")]
[assembly: AssemblyCopyright("Copyright © 2005-2019 by Ivan Bondarev, Stanislav Mihalkovich")]
[assembly: AssemblyCopyright("Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mihalkovich")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion(RevisionClass.FullVersion)]

View file

@ -5,7 +5,7 @@ using System.Runtime.CompilerServices;
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PascalABC.NET Compiler")]
[assembly: AssemblyCopyright("Copyright © 2005-2019 by Ivan Bondarev, Stanislav Mihalkovich")]
[assembly: AssemblyCopyright("Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mihalkovich")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion(RevisionClass.FullVersion)]

View file

@ -1,4 +1,5 @@

#pragma OPENCL EXTENSION cl_khr_fp64: enable
__kernel void MatrMltMatr(__global double* A, __global double* B, __global double* C, int W)

View file

@ -1,4 +1,5 @@

#pragma OPENCL EXTENSION cl_khr_fp64: enable
__kernel void MatrMltMatr(__global double* A, __global double* B, __global double* C, int W)

View file

@ -13,11 +13,11 @@ uses OpenGL;
{$apptype windows} // убирает консоль
var gl: OpenGL.gl;
var gl: OpenGL.gl<PlWin>;
{$region Shader}
function InitShader(fname: string; st: ShaderType): ShaderName;
function InitShader(fname: string; st: ShaderType): gl_shader;
begin
Result := gl.CreateShader(st);
@ -61,12 +61,12 @@ end;
{$region Program}
function InitProgram(vertex_shader, fragment_shader: ShaderName): ProgramName;
function InitProgram(vertex_shader, fragment_shader: gl_shader): gl_program;
begin
Result := gl.CreateProgram;
gl.AttachShader(Result, vertex_shader);
if fragment_shader<>ShaderName.Zero then gl.AttachShader(Result, fragment_shader);
if fragment_shader<>gl_shader.Zero then gl.AttachShader(Result, fragment_shader);
gl.LinkProgram(Result);
// всё то же самое что и у шейдеров
@ -113,13 +113,13 @@ begin
// При создании экземпляра OpenGL.gl инициализируются некоторые функции
// Это необходимо для всех функций из OpenGL1.2 и выше, потому что они локальны для контекста OpenGL
gl := new OpenGL.gl;
gl := new OpenGL.gl<PlWin>;
{$endregion Настройка глобальных параметров OpenGL}
{$region Инициализация переменных}
var vertex_pos_buffer: BufferName;
var vertex_pos_buffer: gl_buffer;
gl.CreateBuffers(1, vertex_pos_buffer);
gl.NamedBufferData(
vertex_pos_buffer,
@ -137,7 +137,7 @@ begin
VertexBufferObjectUsage.STATIC_DRAW
);
var vertex_clr_buffer: BufferName;
var vertex_clr_buffer: gl_buffer;
gl.CreateBuffers(1, vertex_clr_buffer);
gl.NamedBufferData(
vertex_clr_buffer,
@ -150,7 +150,7 @@ begin
VertexBufferObjectUsage.STATIC_DRAW
);
var element_buffer: BufferName;
var element_buffer: gl_buffer;
gl.CreateBuffers(1, element_buffer);
gl.NamedBufferData(
element_buffer,
@ -164,7 +164,7 @@ begin
var vertex_shader := InitShader('Rot Triangle 1.vertex.glsl', ShaderType.VERTEX_SHADER);
// var fragment_shader := InitShader('fragment.glsl', ShaderType.FRAGMENT_SHADER);
var sprog := InitProgram(vertex_shader, ShaderName.Zero {fragment_shader});
var sprog := InitProgram(vertex_shader, gl_shader.Zero {fragment_shader});
var uniform_rot_k := gl.GetUniformLocation(sprog, 'rot_k');

View file

@ -916,7 +916,7 @@ window.onload = ()=>{
</div>
<script>on_page_added(document.getElementById("page-1"))</script>
<div id="page-2" page_name="О неуправляемых .dll" hidden=true>
<p>Лучше прочитайте <a href="https://docs.microsoft.com/en-us/dotnet/standard/managed-code">оффициальный документ от microsoft</a>, если хотите точной и подробно информации.</p>
<p>Лучше прочитайте <a href="https://docs.microsoft.com/en-us/dotnet/standard/managed-code">оффициальный документ от microsoft</a>, если хотите точной и подробной информации.</p>
<p>Если в кратце:</p>
<p>Есть платформа .Net, объединяющая много языков программирования. В том числе C# и PascalABC.NET.</p>
<p>.exe и .dll созданные такими языками содержат код в особом виде, позволяющем легко подключать
@ -939,7 +939,7 @@ window.onload = ()=>{
<p>Чтоб чистить подпрограммы было проще - я написал несколько инструментов.
Вся упаковка н.у. модулей находится <a href="https://github.com/SunSerega/POCGL/tree/master/Packing/Template">тут</a>.
Откройте папку <code>OpenCL</code> или <code>OpenGL</code>. Они устроены одинаково, поэтому объяснять можно на любой из них.</p>
<p>Все файлы (кроме .exe и .pdb, которые создаёт паскаль) в
<p>Все файлы (кроме .exe, .pdb и .pcu, которые создаёт паскаль) в
этих папках открываются любым текстовым редактором.</p>
<hr />
<h3>Fixers</h3>
@ -964,7 +964,7 @@ window.onload = ()=>{
<hr />
<p>Чтоб применить фиксеры и посмотреть на что они влияют - вызывайте <code>Pack Most.pas</code>.</p>
<p>Ну а чтоб полностью собрать модули - вызывайте <code>PackAll.exe</code> в корне репозитория.<br />
(или <code>.bat</code> файлы там же, для сборки отдельно 1 модуля)</p>
(или <code>.bat</code> файлы там же, для сборки отдельных компонентов)</p>
</div>
<script>on_page_added(document.getElementById("page-3"))</script>
<script>on_end_folder()</script>
@ -998,12 +998,12 @@ window.onload = ()=>{
<p>Имена объектов - это числа (в OpenGL обычно на 32 бита, в OpenCL - зависит от битности системы).</p>
<p>Чтоб в подпрограмму, принимающую имена объектов определённого типа нельзя было передать имя
объекта неправильного типа - в н.у. модулях для каждого типа объектов описана подобная запись:</p>
<pre><code> BufferName = record
<pre><code> gl_buffer = record
public val: UInt32;
public constructor(val: UInt32) := self.val := val;
public static property Zero: BufferName read default(BufferName);
public static property Zero: gl_buffer read default(gl_buffer);
public static property Size: integer read Marshal.SizeOf&amp;&lt;UInt32&gt;;
public function ToString: string; override := $'BufferName[{val}]';
public function ToString: string; override := $'gl_buffer[{val}]';
end;
</code></pre>
<p>Такой подход не замедляет готовую программу, но позволяет отловить некоторые ошибки на этапе компиляции.</p>
@ -1012,8 +1012,8 @@ window.onload = ()=>{
<p>В обычной ситуации - вы будете взаимодействовать с именами только 3 способами:</p>
<ol>
<li><p>Объявление:</p>
<pre><code>var name: BufferName;
var names: array of BufferName := new BufferName[5];
<pre><code>var name: gl_buffer;
var names: array of gl_buffer := new gl_buffer[5];
</code></pre>
</li>
<li><p>Передача исходным библиотекам:</p>
@ -1022,14 +1022,14 @@ gl.CreateBuffers(names.Length, names);
</code></pre>
</li>
<li><p>Использование статичного свойства <code>.Zero</code>:</p>
<pre><code>procedure MyProc(buff: BufferName);
<pre><code>procedure MyProc(buff: gl_buffer);
begin
...
end;
...
MyProc(BufferName.Zero);
// Это то же самое, но с лишними скобками
MyProc(default(BufferName));
MyProc(gl_buffer.Zero);
// То же самое, но с лишними скобками:
MyProc(default(gl_buffer));
</code></pre>
<p>У настоящих объектов имя никогда не будет нулевым.</p>
<p>Но бывает не мало случаев когда исходные библиотеки могут принимать нулевое имя.<br />
@ -1042,7 +1042,7 @@ MyProc(default(BufferName));
<p>Многие параметры подпрограмм в исходных библиотеках принимают перечисления (enum'ы).</p>
<p>Перечисления, как и имена, это числа. Но в отличии от имён - перечисления принимают заданные заранее константные значения.</p>
<p>В качестве примера:</p>
<pre><code>procedure gl.BeginQuery(target: QueryTarget; id: QueryName);
<pre><code>procedure gl.BeginQuery(target: QueryTarget; id: gl_query)
</code></pre>
<p>Параметр <code>target</code> принимает одно из значений, сгрупированных в записи <code>QueryTarget</code>:</p>
<pre><code> QueryTarget = record
@ -1076,7 +1076,7 @@ MyProc(default(BufferName));
end;
</code></pre>
<p>То есть вызов может выглядеть так:</p>
<pre><code>var name: QueryName;
<pre><code>var name: gl_query;
...
gl.BeginQuery(QueryTarget.VERTICES_SUBMITTED, name);
</code></pre>
@ -1087,15 +1087,10 @@ gl.BeginQuery(QueryTarget.VERTICES_SUBMITTED, name);
<pre><code>procedure gl.Clear(mask: ClearBufferMask);
</code></pre>
<pre><code>gl.Clear(
ClearBufferMask.COLOR_BUFFER_BIT or // очистка поверхности рисования одним цветом
ClearBufferMask.DEPTH_BUFFER_BIT // очистка буфера глубины - обязательна при рисовании 3D
ClearBufferMask.COLOR_BUFFER_BIT + // Очистка поверхности рисования одним цветом
ClearBufferMask.DEPTH_BUFFER_BIT // Очистка буфера глубины - нужна при рисовании 3D
);
</code></pre>
<p><code>or</code>, в данном случае, побитовое, а не логическое.</p>
<p>Выражение<br />
<code>ClearBufferMask.COLOR_BUFFER_BIT or ClearBufferMask.DEPTH_BUFFER_BIT</code><br />
можно читать как &quot;все биты <code>COLOR_BUFFER_BIT</code> + все биты <code>DEPTH_BUFFER_BIT</code>&quot;.</p>
<p>А в случае <code>gl.Clear</code> эта комбинация значит &quot;очистить буфер цвета <strong>и</strong> буфер глубины&quot;</p>
</code></pre>
</div>
<script>on_page_added(document.getElementById("page-6"))</script>
<div id="page-7" page_name="Классы-контейнеры подпрограмм" hidden=true>
@ -1107,12 +1102,18 @@ gl.BeginQuery(QueryTarget.VERTICES_SUBMITTED, name);
</code></pre>
<p>По нажатию точки после <code>cl</code> вам так же покажет список всех функций в ядре OpenCL.</p>
<hr />
<p>С OpenGL немного сложнее: в каждом контексте у каждой подпрограммы может быть свой адрес.
Поэтому подпрограммы надо получать в зависимости от контекста. В модуле <code>OpenGL</code> это реализовано так:</p>
<pre><code>//ToDo создание контекста и привязка его к текущему потоку
<p>С OpenGL немного сложнее:</p>
<ol>
<li>В каждом контексте у каждой подпрограммы может быть свой адрес.</li>
<li>Получение адреса подпрограммы выглядит по-разному на разных платформах.</li>
</ol>
<p>В модуле <code>OpenGL</code> это реализовано так:</p>
<pre><code>//ToDo Создание контекста и привязка его к текущему потоку
// все адреса и экземпляры делегатов создаются в конструкторе
var gl := new OpenGL.gl;
// Все адреса и экземпляры делегатов создаются в конструкторе
// В &quot;&lt;&gt;&quot; указывается имя платформы
// Можете написать &quot;Pl&quot; и нажать Ctrl+пробел, чтоб получить список платформ
var gl := new OpenGL.gl&lt;PlWin&gt;;
while true do
begin
@ -1126,27 +1127,28 @@ end;
</code></pre>
<hr />
<p>У каждого расширения есть свой класс. К примеру, так используется расширение <code>GL_AMD_debug_output</code>:</p>
<pre><code>//ToDo опять же, сначала контекст
<pre><code>//ToDo Опять же, сначала контекст
var glDebugOutputAMD := new OpenGL.glDebugOutputAMD;
var glDebugOutputAMD := new OpenGL.glDebugOutputAMD&lt;PlWin&gt;;
...
glDebugOutputAMD.DebugMessageEnableAMD(...);
</code></pre>
<hr />
<p>В модуле <code>OpenGL</code> так же есть особые классы, <code>wgl</code> и <code>gdi</code>:</p>
<p>В модуле <code>OpenGL</code> так же есть особые классы, <code>wgl</code>, <code>gdi</code> и <code>glx</code>:</p>
<ul>
<li><p><code>gdi</code> содержит несколько методов библиотеки <code>gdi32.dll</code>. На этой библиотеке основано всё в <code>System.Windows.Forms</code>.<br />
Подпрограммы включённые в класс <code>gdi</code> - это то что может понадобиться вам чтоб настроить и подготовить форму для рисования на ней с помощью OpenGL.</p>
Подпрограммы включённые в класс <code>gdi</code> - это то, что может понадобиться вам, чтоб настроить и подготовить форму для рисования на ней с помощью OpenGL.</p>
</li>
<li><p><code>wgl</code> содержит методы для работы с OpenGL на Windows. Для других ОС есть класс <code>glX</code>, но он сейчас выключен из релиза.
Это потому, что у меня нет компьютера, на котором установлена другая ОС, а значит я не могу
заняться тестированием чтоб узнать как правильно объявлять всё в этом классе. Если у вас есть
другая ОС и вы хотите помочь мне разобраться - пожалуйста, свяжитесь со мной (желательно в issue).</p>
<li><p><code>wgl</code> содержит методы для подключения OpenGL к окну Windows.</p>
</li>
<li><p><code>glx</code> содержит методы для подключения OpenGL к окну XWindow.</p>
</li>
</ul>
<p>Оба этих класса работают как класс <code>cl</code>, то есть им <strong>не</strong> надо создавать экземпляр.</p>
<hr />
<p>И последнее что вам надо знать об этих классах: Если вы получаете <code>NullReferenceException</code>:</p>
<p>И последнее что вам надо знать об этих классах:<br />
Если вы получаете <code>NullReferenceException</code>,
при попытке вызова функции из инициализируемых классов, как <code>gl</code>:</p>
<ol>
<li><p>Скорее всего вы попытались вызвать подпрограмму, которой нет в реализации библиотеки на вашем компьютере.<br />
Проверьте версию библиотеки, или, если это подпрограмма из расширения - проверьте существование у вас этого расширения.</p>
@ -1270,25 +1272,29 @@ v2.Println;
v2.SqrLength.Sqrt.Println; // Обязательно будет 1
</code></pre>
<h3>Cross</h3>
<p>Статичный метод <code>.Cross</code> возвращает произведение векторов (Cross product, не путать со скалярным произведением).
<p>Статичные методы <code>.Cross[CW,CCW]</code> возвращают векторное произведение двух
3-х мерных векторов (&quot;Cross product&quot;, не путать со скалярным произведением).<br />
Векторное произведение - это вектор, перпендикулярный обоим входным векторам и имеющий длину,
равную площади параллелограмма, образованного входными векторами.</p>
<p>Работает только для 3-х мерных векторов.</p>
<p>И не работает для векторов с элементами-беззнаковыми целыми.<br />
(потому что даёт переполнение на практически любых входных значениях. Если найдёте нормальное применение - напишите в issue).</p>
<p>Не работает для векторов с элементами-беззнаковыми_целыми, потому что даёт переполнение
на практически любых входных значениях. Если найдёте нормальное применение - напишите в issue.</p>
<p>В математике произведение векторов может вернуть один из двух противоположных друг-другу векторов,
в зависимости от ориентации системы координат. В модуле <code>OpenGL</code> это решено следующим образом:</p>
<pre><code>var c := Vec3d.Cross(a, b);
</code></pre>
<p>В данном случае, вектор <code>c</code> будет такой, чтоб соблюдалось следующее условие:</p>
<ul>
<li>Если поставить начала всех 3 векторов в точку (0;0;0), а камеру в точку (a+b+c) и направить
в точку (0;0;0) - вектора a, b и c будут расположены по часовой стрелке вокруг центра экрана.</li>
<li><p><code>Vec3d.CrossCW(new Vec3d(1,0,0), new Vec3d(0,1,0)) = new Vec3d(0,0,1)</code>.</p>
</li>
<li><p><code>Vec3d.CrossCCW(a,b) = -Vec3d.CrossCW(a,b)</code>;</p>
</li>
</ul>
<p>Если надо чтоб было против часовой стрелки - можно использовать CCW (counter clock wise, против часовой стрелки) версию <code>.Cross</code>:</p>
<pre><code>var c := Vec3d.CrossCCW(a,b);
<h3>Ввод с клавиатуры</h3>
<p>Статичные методы <code>Read</code> и <code>Readln</code> создают новый вектор из элементов, прочитанных из стандартного ввода:</p>
<pre><code>// Прочитать 2 числа из ввода
Vec2d.Read('Введите 2 координаты:').Println;
// Прочитать 2 числа из ввода
// и затем пропустить всё до конца строки
Vec2d.Readln.Println;
</code></pre>
<p>(ну или можно использовать <code>-Vec3d.Cross(a,b)</code>, это даст тот же результат но с 1 лишней операцией)</p>
<h3>Превращение в строку</h3>
<pre><code>var v1: Vec4d;
...
@ -1438,6 +1444,19 @@ m.Transpose.Println; // Выводит:
<code>v*m</code> это то же самое что <code>m.Transpose*v</code>.</p>
<h3>Умножение 2 матриц</h3>
<p><code>m1*m2</code> - это математическое умножение матриц <code>m1</code> и <code>m2</code>.</p>
<h3>Ввод с клавиатуры</h3>
<p>Статичные методы <code>Read[,ln][Rows,Cols]</code> создают новую матрицу из элементов, прочитанных из стандартного ввода:</p>
<pre><code>// Прочитать 3*4=12 элементов из ввода
// и сохранить в новую матрицу по строкам
Mtr3x4d.ReadRows('Введите 12 элементов матрицы:').Println;
// Прочитать 4 элемета из ввода, переходя на
// следущую строку ввода после чтения каждого столбца
Mtr2d.ReadlnCols(
'Введите столбцы матрицы...',
col -&gt; $'Столбец #{col}:'
).Println;
</code></pre>
<h3>Превращение в строку</h3>
<p>Как и у векторов - матрицы можно выводить и превращать в строку</p>
<pre><code>var m: Mtr4d;
@ -1814,10 +1833,16 @@ begin
d.DynamicInvoke(5); // вообще .DynamicInvoke это очень медленно
var p: integer-&gt;();
// var p: Action&lt;integer&gt;; // такое же объявление как на предыдущей строчке, но в другом стиле
// Такое же объявление как на предыдущей строчке, но в другом стиле
// var p: Action&lt;integer&gt;;
// И ещё один стиль. Этот особенный, потому что
// он неявно создаёт новый тип делегата
// var p: procedure(i: integer);
p := p1;
p(5); // типизированные делегаты можно вызывать быстрее и проще, так же как обычные подпрограммы
// Типизированные делегаты можно вызывать быстрее и проще,
// так же как обычные подпрограммы
p(5);
end.
</code></pre>
@ -1851,7 +1876,7 @@ end.
<ol>
<li><p><code>cl.SetEventCallback</code> вызывает свой коллбек тогда, когда посчитает нужным (но обычно после того как вызов <code>cl.SetEventCallback</code> завершился);</p>
</li>
<li><p>Делегаты - это классы. И на самом деле кроме самого адреса хранят ещё много всякой информации (как типы параметров);</p>
<li><p>Делегаты - это классы.</p>
</li>
<li><p>Сборщик мусора распоряжается памятью классов и удаляет их, тоже когда посчитает нужным.</p>
</li>
@ -1862,9 +1887,9 @@ end.
<p>Если сборщик мусора удалит делегат, а затем .dll попытается его вызвать -
это приведёт или к ошибке доступа, или к моментальному беззвучному вылету.</p>
<p>Чтоб запретить сборщику мусора удалять делегать - нужно создать <code>GCHandle</code>, привязанный к нему.<br />
Но в отличии от массивов - <code>GCHandleType.Pinned</code> не нужно, потому что сборщик мусора может перемещать
в памяти данные о параметрах делегата, но не сам адрес (а он единственное что передаётся в .dll).
Это потому что адрес хранится в виде указателя на неуправляемый код.</p>
Но в отличии от массивов - <code>GCHandleType.Pinned</code> не нужно, потому что сборщик мусора
не может перемещать адрес исполняемого кода (а он единственное что передаётся в .dll).
Это потому, что этот адрес хранится в виде указателя на неуправляемый код.</p>
<pre><code>uses System.Runtime.InteropServices;
uses System;
uses OpenCL;
@ -1877,8 +1902,8 @@ begin
Writeln($'{ev} перешёл в состояние {st}');
// в данном случае освобождать GCHandle станет можно тогда, когда делегат 1 раз выполнится,
// а значит очень удобно поставить освобождение в конец самого делегата
// В данном случае освобождать GCHandle станет можно тогда, когда делегат 1 раз выполнится,
// А значит очень удобно поставить освобождение в конец самого делегата
gc_hnd.Free;
end;
gc_hnd := GCHandle.Alloc(cb);

View file

@ -1012,7 +1012,7 @@ end.
Неявные очереди всегда используют <code>Context.Default</code>.</p>
<p>Изначально этому свойству присваивается контекст, использующий GPU, если оно имеется,
или любое другое устройство, поддерживающее OpenCL, если GPU отсутствует.</p>
<p>Если устройств, поддерживающих <code>OpenCL</code>, нет - <code>Context.Default</code> будет <code>nil</code>.<br />
<p>Если устройств поддерживающих <code>OpenCL</code> нет - <code>Context.Default</code> будет <code>nil</code>.<br />
Однако такая ситуация теоретически невозможна, потому что OpenCL поддерживается
всеми современными устройствами, занимающимися выводом изображения на экран.<br />
Если <code>Context.Default = nil</code> - переустановите графические драйверы.</p>
@ -1025,8 +1025,8 @@ end.
<script>on_start_folder("Context", document.getElementById("page-6"))</script>
<script>on_end_folder()</script>
<div id="page-7" page_name="" hidden=true>
<p>Программам, выпоняемым на GPU, неудобно использовать оперативную память.
Поэтому обычно надо выделять память на самОм GPU.<br />
<p>Программам, выпоняемые на GPU, не удобно использовать оперативную память.
Поэтому обычно надо выделять память на самом GPU.<br />
Объекты типа <code>Buffer</code> представляют такую область памяти.</p>
<hr />
<p>Буфер создаётся конструктором (<code>new Buffer(...)</code>).</p>
@ -1034,13 +1034,13 @@ end.
Если вызвать <code>Buffer.Init</code> 2 раза - память освободится и выделится заново.</p>
<p>Когда на GPU выделяется память - она <strong>НЕ</strong> очищается нулями, а значит содержит мусорные данные.</p>
<p>Если метод <code>Buffer.Init</code> не был вызван до первой операции чтения/записи - он будет вызван автоматически.
В таком случае в качестве контекста, в котором выделяется память, берётся тот,
В таком случае в качестве контекста в котором выделяется память берётся тот,
на котором вызвали <code>.BeginInvoke</code>, который запустил команду чтения/записи буфера.</p>
<p>Память на GPU можно моментально освободить, вызвав метод <code>Buffer.Dispose</code>.
Но если снова использовать буфер, у которого освободили память, - память выделится заново.</p>
Но если снова использовать буфер, у которого освободили память - память выделится заново.</p>
<p>Если сборщик мусора удаляет объект типа <code>Buffer</code> - <code>.Dispose</code> вызывается автоматически.</p>
<hr />
<p>Но кроме выделения памяти GPU - OpenCL также позволяет выделять память внутри другого буфера.<br />
<p>Но кроме выделения памяти GPU - OpenCL так же позволяет выделять память внутри другого буфера.<br />
Для этого используется тип <code>SubBuffer</code>:</p>
<pre><code>uses OpenCLABC;
@ -1074,7 +1074,7 @@ var k := code['KernelName'];
</code></pre>
<p>Тут <code>'KernelName'</code> — имя подпрограммы-kernel'а в исходном коде (регистр важен!).</p>
<hr />
<p>Также можно получить список всех kernel'ов объекта <code>ProgramCode</code>, методом <code>ProgramCode.GetAllKernels</code>:</p>
<p>Так же можно получить список всех kernel'ов объекта <code>ProgramCode</code>, методом <code>ProgramCode.GetAllKernels</code>:</p>
<pre><code>var code: ProgramCode;
...
var ks := code.GetAllKernels;
@ -1230,7 +1230,7 @@ end.
Но потом вы добавите что то в совсем другой части программы, или запустите её на
другом компьютере и она вдруг начнёт выводить мусорные значения, или падать с ошибками
вроде <code>AccessViolationException</code>, которые совершенно не объясняют в чём проблема.</p>
<p>Если очень интересно, откуда берутся эти ограничения, начните с применения .Net декомпилятора к .exe файлам,
<p>Если очень интересно откуда берутся эти ограничения - начните с применения .Net декомпилятора к .exe файлам,
получаемым при компиляции программ с данной страницы. Что останется непонятно - можете спрашивать в issue.</p>
</div>
<script>on_start_folder("Kernel", document.getElementById("page-8"))</script>
@ -1373,7 +1373,7 @@ except
on e: Exception do Writeln(e);
end;
</code></pre>
<p>Для этого кода есть стандартный снипет. Чтобы активировать его, напишите <code>tryo</code> и нажмите Shift+Пробел.</p>
<p>Для этого кода есть стандартный снипет. Чтобы активировать его - напишите <code>tryo</code> и нажмите Shift+Пробел.</p>
</div>
<script>on_start_folder("Выполнение очередей", document.getElementById("page-14"))</script>
<script>on_end_folder()</script>

View file

@ -878,7 +878,7 @@ window.onload = ()=>{
<div id="page-1" page_name="" hidden=true>
<p><code>ToDo</code> модуль <code>OpenGLABC</code> пока что не существует. Когда то он появится, но пока что есть только это сообщение.</p>
<p>Если хотите понять, было ли это сообщение оставлено тут 10 лет назад и забыто - вот дата, когда автор сообщения последний раз прочитал его:<br />
03.08.2020</p>
2021.01.05</p>
</div>
<script>on_start_folder("GL ABC", document.getElementById("page-1"))</script>
<script>on_end_folder()</script>

View file

@ -12,7 +12,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Localization")]
[assembly: AssemblyCopyright("Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyCopyright("Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

View file

@ -3353,8 +3353,8 @@ namespace PascalABCCompiler.NETGenerator
{
if (ti.init_meth != null)
{
il.Emit(OpCodes.Ldloca, lb);
il.Emit(OpCodes.Call, ti.init_meth);
//il.Emit(OpCodes.Ldloca, lb);
//il.Emit(OpCodes.Call, ti.init_meth);
}
LocalBuilder llb = il.DeclareLocal(lb.LocalType.MakePointerType());
il.Emit(OpCodes.Ldloca, lb);

View file

@ -12,7 +12,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Optimizer")]
[assembly: AssemblyCopyright("Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyCopyright("Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

View file

@ -29,7 +29,7 @@ namespace PascalABCCompiler
public string Copyright
{
get { return "Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich"; }
get { return "Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich"; }
}
public PascalABCCompiler.SemanticTreeConverters.ConverterType ConverterType

View file

@ -193,7 +193,7 @@ namespace PascalABCCompiler.DocTagsParser
{
get
{
return "Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich";
return "Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich";
}
}

View file

@ -112,7 +112,7 @@ namespace PascalABCCompiler.PascalABCNewParser
//public Preprocessor2.Preprocessor2 preprocessor2 = new PascalABCCompiler.Preprocessor2.Preprocessor2(null);
public PascalABCNewLanguageParser()
: base("PascalABC.NET", "1.2", "Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich", false, new string[] { ".pas" })
: base("PascalABC.NET", "1.2", "Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich", false, new string[] { ".pas" })
{
}

View file

@ -14,7 +14,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("VBNETParser")]
[assembly: AssemblyCopyright("Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyCopyright("Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

View file

@ -12,7 +12,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SyntaxTreeChanger")]
[assembly: AssemblyCopyright("Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyCopyright("Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

View file

@ -12,7 +12,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SyntaxVisitors")]
[assembly: AssemblyCopyright("Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyCopyright("Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

View file

@ -17,5 +17,5 @@ begin
end;
begin
Assert(1=1)
Assert(1=1);
end.

View file

@ -5,4 +5,16 @@
var w: word := 65535;
Assert(Sqr(w)=w*w);
Assert(Abs(w)=w);
var sm: smallint := smallint.MaxValue;
Assert(Sqr(sm) = sm*sm);
var sh: shortint := shortint.MaxValue;
Assert(Sqr(sh) = sh*sh);
var lw: longword := longword.MaxValue;
Assert(Sqr(lw) = uint64(lw)*uint64(lw));
var i: integer := integer.MaxValue;
Assert(Sqr(i) = int64(i)*int64(i));
var i64: int64 := integer.MaxValue;
Assert(Sqr(i64) = i64*i64);
var ui64: uint64 := integer.MaxValue;
Assert(Sqr(ui64) = ui64*ui64);
end.

View file

@ -8215,7 +8215,7 @@ function LogN(base, x: real) := Math.Log(x) / Math.Log(base);
function Sqrt(x: real) := Math.Sqrt(x);
function Sqr(x: integer): int64 := x * x;
function Sqr(x: integer): int64 := int64(x) * int64(x);
function Sqr(x: shortint): integer := x * x;
@ -8225,11 +8225,11 @@ function Sqr(x: BigInteger): BigInteger := x * x;
function Sqr(x: byte): integer := x * x;
function Sqr(x: word): uint64 := x * x;
function Sqr(x: word): uint64 := uint64(x) * uint64(x);
function Sqr(x: longword): uint64 := x * x;
function Sqr(x: longword): uint64 := uint64(x) * uint64(x);
function Sqr(x: int64): int64 := x * x;
function Sqr(x: int64): int64 := int64(x) * int64(x);
function Sqr(x: uint64): uint64 := x * x;

View file

@ -0,0 +1,14 @@
type
Fixer<TFixer> = class
where TFixer: record;
procedure p1;
begin
var a: TFixer;
var b := a <> nil;
end;
end;
begin end.

View file

@ -0,0 +1,12 @@
type
t0 = class end;
t1<T> = class
where T: t0;
end;
begin
// Компилируется, а не должно
var a: t1<byte>;
end.

View file

@ -0,0 +1,26 @@
type
t0<T> = class
where T: t0<T>;
b: boolean;
static procedure p1(a: T);
begin
var f: Func<T, boolean> := o -> o.b;
assert(f(a));
end;
static procedure p2(a: T);
begin
assert(a.b);
end;
end;
t1 = class(t0<t1>) end;
begin
var a := new t1;
a.b := true;
t1.p1(a);
t1.p2(a);
end.

View file

@ -1,4 +1,4 @@

type
TRec = record a : integer; end;
TRec2 = record b : array of real; end;
@ -51,6 +51,25 @@ Nested;
end;
var i := 1;
procedure Test3;
begin
var rec : TRec := (a:i+3);
var arr : TMas := ((a:i),(a:i+1),(a:i+2));
var arr2 : array of TRec := ((a:i),(a:i+1),(a:i+2));
var rec2 : TRec2 := (b:(i,i,i));
var rec4 : TRec3 := (a:(b:(i,i,i)));
var rec6 : TRec4 := (a:'abcde');
assert(rec.a=4);
assert(arr[2].a=2);
assert(arr2[2].a=3);
assert(rec2.b[0]=i);
assert(rec4.a.b[0]=i);
assert(rec6.a='abcd');
end;
var
rec : TRec := (a:i+3);
arr : TMas := ((a:i),(a:i+1),(a:i+2));
arr2 : array of TRec := ((a:i),(a:i+1),(a:i+2));
@ -69,4 +88,5 @@ assert(rec5.a.a.b[0]=i);
assert(rec6.a='abcd');
Test;
Test2;
Test3;
end.

21
TestSuite/records19.pas Normal file
View file

@ -0,0 +1,21 @@
var i: integer;
type
r1 = record
public function InitI1:integer;
begin
Result := 1;
Inc(i);
end;
public i1: integer := InitI1;
public i2: integer;
end;
function f1 := default(r1);
begin
var a := f1;
assert(i = 1);
end.

23
TestSuite/records20.pas Normal file
View file

@ -0,0 +1,23 @@
var i: integer;
type
r1 = record
public function InitI1:integer;
begin
Result := 1;
Inc(i);
end;
public i1: integer := InitI1;
public i2: integer;
public constructor(i2:integer) :=
self.i2 := i2;
public static function operator implicit(i: integer): r1 := new r1(i);
end;
begin
var a: r1 := 5;
assert(i = 2);
end.

18
TestSuite/records21.pas Normal file
View file

@ -0,0 +1,18 @@
var i: integer;
type
r1 = record
public function InitI1:integer;
begin
Result := 1;
Inc(i);
end;
public i1: integer := InitI1;
public i2: integer;
end;
begin
var a: r1 := (i1: 2; i2: 3);
assert(i = 0);
end.

View file

@ -0,0 +1,12 @@
unit u_where2;
type
t0<T> = class
where T: t0<T>;
procedure p1(a: T); virtual := exit;
end;
end.

View file

@ -0,0 +1,19 @@
uses u_where2;
var i: integer;
type
t1 = class(t0<t1>)
procedure p1(a: t1); override;
begin
i := 1;
end;
end;
begin
var obj := new t1;
obj.p1(obj);
assert(i = 1);
end.

21
TestSuite/where14.pas Normal file
View file

@ -0,0 +1,21 @@
type
Fixer<TFixer> = class
where TFixer: Fixer<TFixer>;
procedure p1;
begin
var a: TFixer;
assert(a = nil);
var o := self as object;
end;
end;
DerFixer = class(Fixer<DerFixer>)
end;
begin
var obj := new DerFixer();
obj.p1;
end.

View file

@ -2129,7 +2129,7 @@ namespace PascalABCCompiler.TreeConverter
{
lbvr.type = SystemLibrary.SystemLibInitializer.TypedSetType.sym_info as type_node;
}
if (vdn.type.is_value_type && userInitalValue is common_constructor_call)
if (vdn.type.is_value_type /*&& userInitalValue is common_constructor_call*/)
{
return new default_operator_node(vdn.type, lid);
}

View file

@ -11974,6 +11974,8 @@ namespace PascalABCCompiler.TreeConverter
{
make_attributes_for_declaration(_type_declaration, ctn);
}
if (cl_def.keyword == class_keyword.Class || cl_def.keyword == class_keyword.Interface)
ctn.is_class = true;//nado ranshe pomechat kak is_class
if (is_generic)
{
if (predefined_generic)
@ -12011,6 +12013,7 @@ namespace PascalABCCompiler.TreeConverter
AddError(get_location(cl_def.class_parents.types[i]), "PARTIAL_CLASS_PARENTS_MISMATCH");
}*/
}
visit_where_list(cl_def.where_section);
CheckWaitedRefTypes(ctn);

View file

@ -166,6 +166,10 @@ namespace PascalABCCompiler.TreeRealization
return new SimpleSemanticError(null, "PARAMETER_{0}_MUST_BE_DERIVED_FROM_{1}", tn.PrintableName, base_type.name);
}
}
if (gpe.base_class != null && gpe.base_class != SystemLibrary.SystemLibrary.object_type && tn.is_value && !gpe.base_class.is_value && gpe.base_class != SystemLibrary.SystemLibrary.value_type)
{
return new SimpleSemanticError(null, "PARAMETER_{0}_MUST_BE_REFERENCE_TYPE", tn.PrintableName);
}
foreach (type_node interf in gpe.implementing_interfaces)
{
type_node di = generic_convertions.determine_type(interf, tparams, method_param_types);
@ -309,6 +313,8 @@ namespace PascalABCCompiler.TreeRealization
//Определяем базовый тип
type_node btype = determine_type(
original.base_type, param_types, false);
if (btype == null)
btype = SystemLibrary.SystemLibrary.object_type;
instance.SetBaseTypeIgnoringScope(btype);
//instance._scope = new SymbolTable.GenericTypeInstanceScope(instance, instance.original_generic.Scope, btype.Scope);

View file

@ -278,7 +278,12 @@ namespace PascalABCCompiler.TreeRealization
}
if (tn.is_generic_parameter)
{
return (tn.is_class || tn.base_type != SystemLibrary.SystemLibrary.object_type && tn.base_type.is_class);
if (tn.is_class)
return true;
if (tn.base_type.is_value || tn.is_value_type)
return false;
return true;
//return (tn.is_class || tn.base_type != SystemLibrary.SystemLibrary.object_type && tn.base_type.is_class);
}
else if (tn is ref_type_node)
{

View file

@ -168,7 +168,7 @@
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(311, 13);
this.label12.TabIndex = 17;
this.label12.Text = "Copyright (c) 2005, 2020 Ivan Bondarev, Stanislav Mikhalkovich";
this.label12.Text = "Copyright (c) 2005, 2021 Ivan Bondarev, Stanislav Mikhalkovich";
this.label12.Click += new System.EventHandler(this.label12_Click);
//
// label9

View file

@ -130,7 +130,7 @@ namespace VisualPascalABC
if (comp != null)
{
Assembly a = Assembly.GetAssembly(comp.GetType());
dgvModules.Items.Add(MakeItem("Core", "PascalABCCompiler.Core", a.GetName().Version.ToString(), "Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich"));
dgvModules.Items.Add(MakeItem("Core", "PascalABCCompiler.Core", a.GetName().Version.ToString(), "Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich"));
foreach (PascalABCCompiler.Parsers.IParser parser in comp.ParsersController.Parsers)
dgvModules.Items.Add(MakeItem("Parser",parser.Name, parser.Version, parser.Copyright));
foreach (PascalABCCompiler.SemanticTreeConverters.ISemanticTreeConverter conv in comp.SemanticTreeConvertersController.SemanticTreeConverters)

View file

@ -32,7 +32,7 @@ namespace VisualPascalABCPlugins
{
get
{
return "Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich";
return "Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich";
}
}

View file

@ -14,7 +14,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("HelpBuilder")]
[assembly: AssemblyCopyright("Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyCopyright("Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

View file

@ -31,7 +31,7 @@ namespace VisualPascalABCPlugins
{
get
{
return "Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich";
return "Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich";
}
}

View file

@ -93,7 +93,7 @@ namespace VisualPascalABCPlugins
{
get
{
return "Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich";
return "Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich";
}
}

View file

@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ExtendedCompilerInformation")]
[assembly: AssemblyCopyright("Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyCopyright("Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

View file

@ -33,7 +33,7 @@ namespace VisualPascalABCPlugins
{
get
{
return "Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich";
return "Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich";
}
}

View file

@ -35,7 +35,7 @@ namespace VisualPascalABCPlugins
{
get
{
return "Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich";
return "Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich";
}
}

View file

@ -27,7 +27,7 @@ namespace VisualPascalABCPlugins
{
get
{
return "Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich";
return "Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich";
}
}

View file

@ -27,7 +27,7 @@ namespace VisualPascalABCPlugins
{
get
{
return "Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich";
return "Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich";
}
}

View file

@ -29,7 +29,7 @@ namespace VisualPascalABCPlugins
{
get
{
return "Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich";
return "Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich";
}
}

View file

@ -0,0 +1,44 @@
call Studio.bat /t:rebuild "/property:Configuration=Release" "/p:Platform=Any CPU" PascalABCNET.sln
@IF %ERRORLEVEL% NEQ 0 GOTO ERROR
cd ReleaseGenerators
..\bin\pabcnetc RebuildStandartModules.pas /rebuild /noconsole
@IF %ERRORLEVEL% NEQ 0 GOTO ERROR
cd PABCRtl
..\..\bin\pabcnetc PABCRtl.pas /rebuild /noconsole
@IF %ERRORLEVEL% NEQ 0 GOTO ERROR
..\sn.exe -Vr PABCRtl.dll
..\sn.exe -R PABCRtl.dll KeyPair.snk
..\sn.exe -Vu PABCRtl.dll
copy PABCRtl.dll ..\..\bin\Lib
cd ..
ExecHide.exe gacutil.exe /u PABCRtl
ExecHide.exe gacutil.exe /i ..\bin\Lib\PABCRtl.dll
..\bin\pabcnetc RebuildStandartModules.pas /rebuild /noconsole
@IF %ERRORLEVEL% NEQ 0 GOTO ERROR
cd ..\bin
REM MPGORunner.exe
TestRunner.exe 1 1
@IF %ERRORLEVEL% NEQ 0 GOTO ERROR
TestRunner.exe 2 1
@IF %ERRORLEVEL% NEQ 0 GOTO ERROR
TestRunner.exe 3 1
@IF %ERRORLEVEL% NEQ 0 GOTO ERROR
TestRunner.exe 4 1
@IF %ERRORLEVEL% NEQ 0 GOTO ERROR
TestRunner.exe 5 1
@IF %ERRORLEVEL% NEQ 0 GOTO ERROR
TestRunner.exe 6 1
@IF %ERRORLEVEL% NEQ 0 GOTO ERROR
cd ..
GOTO EXIT
:ERROR
PAUSE
:EXIT

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -8215,7 +8215,7 @@ function LogN(base, x: real) := Math.Log(x) / Math.Log(base);
function Sqrt(x: real) := Math.Sqrt(x);
function Sqr(x: integer): int64 := x * x;
function Sqr(x: integer): int64 := int64(x) * int64(x);
function Sqr(x: shortint): integer := x * x;
@ -8225,11 +8225,11 @@ function Sqr(x: BigInteger): BigInteger := x * x;
function Sqr(x: byte): integer := x * x;
function Sqr(x: word): uint64 := x * x;
function Sqr(x: word): uint64 := uint64(x) * uint64(x);
function Sqr(x: longword): uint64 := x * x;
function Sqr(x: longword): uint64 := uint64(x) * uint64(x);
function Sqr(x: int64): int64 := x * x;
function Sqr(x: int64): int64 := int64(x) * int64(x);
function Sqr(x: uint64): uint64 := x * x;

Binary file not shown.

View file

@ -11,7 +11,8 @@ uses PascalABCCompiler, System.IO, System.Diagnostics;
var
TestSuiteDir: string;
nogui: boolean;
var
PathSeparator: string := Path.DirectorySeparatorChar;
@ -56,13 +57,19 @@ begin
comp.Compile(co);
if comp.ErrorsList.Count = 0 then
begin
if nogui then
raise new Exception('Compilation of error sample ' + files[i] + ' was successfull');
System.Windows.Forms.MessageBox.Show('Compilation of error sample ' + files[i] + ' was successfull' + System.Environment.NewLine);
Halt();
end
else if comp.ErrorsList.Count = 1 then
begin
if comp.ErrorsList[0].GetType() = typeof(PascalABCCompiler.Errors.CompilerInternalError) then
begin
if nogui then
raise new Exception('Compilation of ' + files[i] + ' failed' + System.Environment.NewLine + comp.ErrorsList[0].ToString());
System.Windows.Forms.MessageBox.Show('Compilation of ' + files[i] + ' failed' + System.Environment.NewLine + comp.ErrorsList[0].ToString());
end;
end;
if i mod 50 = 0 then
System.GC.Collect();
@ -96,6 +103,8 @@ begin
comp.Compile(co);
if comp.ErrorsList.Count > 0 then
begin
if nogui then
raise new Exception('Compilation of ' + files[i] + ' failed' + System.Environment.NewLine + comp.ErrorsList[0].ToString());
System.Windows.Forms.MessageBox.Show('Compilation of ' + files[i] + ' failed' + System.Environment.NewLine + comp.ErrorsList[0].ToString());
Halt();
end;
@ -130,6 +139,8 @@ begin
comp.Compile(co);
if comp.ErrorsList.Count > 0 then
begin
if nogui then
raise new Exception('Compilation of ' + files[i] + ' failed' + System.Environment.NewLine + comp.ErrorsList[0].ToString());
System.Windows.Forms.MessageBox.Show('Compilation of ' + files[i] + ' failed' + System.Environment.NewLine + comp.ErrorsList[0].ToString());
Halt();
end;
@ -159,6 +170,8 @@ begin
comp.Compile(co);
if comp.ErrorsList.Count > 0 then
begin
if nogui then
raise new Exception('Compilation of ' + files[i] + ' failed' + System.Environment.NewLine + comp.ErrorsList[0].ToString());
System.Windows.Forms.MessageBox.Show('Compilation of ' + files[i] + ' failed' + System.Environment.NewLine + comp.ErrorsList[0].ToString());
Halt();
end;
@ -186,6 +199,8 @@ begin
comp.Compile(co);
if comp.ErrorsList.Count > 0 then
begin
if nogui then
raise new Exception('Compilation of ' + files[i] + ' failed' + System.Environment.NewLine + comp.ErrorsList[0].ToString());
System.Windows.Forms.MessageBox.Show('Compilation of ' + files[i] + ' failed' + System.Environment.NewLine + comp.ErrorsList[0].ToString());
Halt();
end;
@ -230,11 +245,22 @@ begin
p.StandardInput.WriteLine('GO');
//p.StandardInput.AutoFlush := true;
//var p := System.Diagnostics.Process.Start(psi);
while not p.HasExited do
Sleep(10);
if nogui then
begin
var success := p.WaitForExit(60000);
if not success then
begin
raise new Exception('Running of ' + files[i] + ' failed.');
end;
end
else
p.WaitForExit();
//while not p.HasExited do
// Sleep(5);
if p.ExitCode <> 0 then
begin
if nogui then
raise new Exception('Running of ' + files[i] + ' failed. Exit code is not 0');
System.Windows.Forms.MessageBox.Show('Running of ' + files[i] + ' failed. Exit code is not 0');
Halt;
end;
@ -344,17 +370,21 @@ begin
try
TestSuiteDir := GetTestSuiteDir;
System.Environment.CurrentDirectory := Path.GetDirectoryName(GetEXEFileName());
if (ParamCount = 2) and (ParamStr(2) = '1') then
nogui := true;
if (ParamCount = 0) or (ParamStr(1) = '1') then
begin
DeletePCUFiles;
ClearExeDir;
CompileAllRunTests(false);
writeln('Tests to run: '+Milliseconds()+'ms');
end;
if (ParamCount = 0) or (ParamStr(1) = '2') then
begin
CopyLibFiles;
CompileAllCompilationTests('CompilationSamples', false);
writeln('CompilationSamples: '+Milliseconds()+'ms');
end;
if (ParamCount = 0) or (ParamStr(1) = '3') then
begin
@ -362,12 +392,12 @@ begin
CopyPCUFiles;
CompileAllUsesUnits;
CompileErrorTests(false);
writeln('Tests compiled successfully');
writeln('Other tests '+Milliseconds()+'ms'+'. Tests compiled successfully ');
end;
if (ParamCount = 0) or (ParamStr(1) = '4') then
begin
RunAllTests(false);
writeln('Tests run successfully');
writeln('Tests run successfully: '+Milliseconds()+'ms');
ClearExeDir;
DeletePCUFiles;
end;
@ -397,6 +427,11 @@ begin
end;
except
on e: Exception do
begin
if nogui then
raise new Exception(e.ToString());
assert(false, e.ToString());
end;
end;
end.

View file

@ -13,7 +13,7 @@ using System.Runtime.CompilerServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("")]
[assembly: AssemblyCopyright("Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyCopyright("Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

View file

@ -375,7 +375,7 @@ namespace PascalABCCompiler
DateTime ldt = DateTime.Now;
Compiler = new PascalABCCompiler.Compiler(null,ChangeCompilerState);
//GC.Collect();
WriteColorText(Compiler.Banner + "\nCopyright (c) 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich\n", ConsoleColor.Black, ConsoleColor.Green);
WriteColorText(Compiler.Banner + "\nCopyright (c) 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich\n", ConsoleColor.Black, ConsoleColor.Green);
Console.WriteLine("OK {0}ms", (DateTime.Now - ldt).TotalMilliseconds);
if (Compiler.SupportedSourceFiles.Length == 0)
WriteColorText(StringResourcesGet("ERROR_PARSERS_NOT_FOUND")+Environment.NewLine,ConsoleColor.Black,ConsoleColor.Red);

View file

@ -13,7 +13,7 @@ using System.Runtime.CompilerServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("")]
[assembly: AssemblyCopyright("Copyright © 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyCopyright("Copyright © 2005-2021 by Ivan Bondarev, Stanislav Mikhalkovich")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]