Merge branch 'master' of https://github.com/pascalabcnet/pascalabcnet
This commit is contained in:
commit
d391efc968
38
.github/workflows/buildandruntests.yml
vendored
Normal file
38
.github/workflows/buildandruntests.yml
vendored
Normal 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
|
||||
|
|
@ -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("")]
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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("")]
|
||||
|
||||
|
|
|
|||
|
|
@ -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)]
|
||||
|
|
|
|||
|
|
@ -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)]
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
||||
|
|
|
|||
|
|
@ -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&<UInt32>;
|
||||
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 />
|
||||
можно читать как "все биты <code>COLOR_BUFFER_BIT</code> + все биты <code>DEPTH_BUFFER_BIT</code>".</p>
|
||||
<p>А в случае <code>gl.Clear</code> эта комбинация значит "очистить буфер цвета <strong>и</strong> буфер глубины"</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;
|
||||
// Все адреса и экземпляры делегатов создаются в конструкторе
|
||||
// В "<>" указывается имя платформы
|
||||
// Можете написать "Pl" и нажать Ctrl+пробел, чтоб получить список платформ
|
||||
var gl := new OpenGL.gl<PlWin>;
|
||||
|
||||
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<PlWin>;
|
||||
...
|
||||
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-х мерных векторов ("Cross product", не путать со скалярным произведением).<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 -> $'Столбец #{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->();
|
||||
// var p: Action<integer>; // такое же объявление как на предыдущей строчке, но в другом стиле
|
||||
// Такое же объявление как на предыдущей строчке, но в другом стиле
|
||||
// var p: Action<integer>;
|
||||
// И ещё один стиль. Этот особенный, потому что
|
||||
// он неявно создаёт новый тип делегата
|
||||
// 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);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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("")]
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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("")]
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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" })
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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("")]
|
||||
|
||||
|
|
|
|||
|
|
@ -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("")]
|
||||
|
||||
|
|
|
|||
|
|
@ -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("")]
|
||||
|
||||
|
|
|
|||
|
|
@ -17,5 +17,5 @@ begin
|
|||
end;
|
||||
|
||||
begin
|
||||
Assert(1=1)
|
||||
Assert(1=1);
|
||||
end.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
14
TestSuite/errors/err0392.pas
Normal file
14
TestSuite/errors/err0392.pas
Normal 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.
|
||||
12
TestSuite/errors/err0393.pas
Normal file
12
TestSuite/errors/err0393.pas
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
type
|
||||
t0 = class end;
|
||||
|
||||
t1<T> = class
|
||||
where T: t0;
|
||||
|
||||
end;
|
||||
|
||||
begin
|
||||
// Компилируется, а не должно
|
||||
var a: t1<byte>;
|
||||
end.
|
||||
26
TestSuite/lambdas_generics10.pas
Normal file
26
TestSuite/lambdas_generics10.pas
Normal 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.
|
||||
|
|
@ -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
21
TestSuite/records19.pas
Normal 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
23
TestSuite/records20.pas
Normal 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
18
TestSuite/records21.pas
Normal 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.
|
||||
12
TestSuite/units/u_where2.pas
Normal file
12
TestSuite/units/u_where2.pas
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
unit u_where2;
|
||||
|
||||
type
|
||||
|
||||
t0<T> = class
|
||||
where T: t0<T>;
|
||||
|
||||
procedure p1(a: T); virtual := exit;
|
||||
|
||||
end;
|
||||
|
||||
end.
|
||||
19
TestSuite/usesunits/use_where2.pas
Normal file
19
TestSuite/usesunits/use_where2.pas
Normal 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
21
TestSuite/where14.pas
Normal 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.
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
2
VisualPascalABCNET/AboutBox.Designer.cs
generated
2
VisualPascalABCNET/AboutBox.Designer.cs
generated
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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("")]
|
||||
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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("")]
|
||||
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
44
_RebuildReleaseAndRunTestsForGitHubActions.bat
Normal file
44
_RebuildReleaseAndRunTestsForGitHubActions.bat
Normal 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
|
||||
1751
bin/Lib/OpenCL.pas
1751
bin/Lib/OpenCL.pas
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
48965
bin/Lib/OpenGL.pas
48965
bin/Lib/OpenGL.pas
File diff suppressed because it is too large
Load diff
|
|
@ -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.
|
|
@ -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.
|
||||
|
|
@ -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("")]
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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("")]
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue