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: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("CodeCompletion")]
|
[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: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2211,6 +2211,10 @@ namespace PascalABCCompiler.PCU
|
||||||
ctn.type_special_kind = tsk;
|
ctn.type_special_kind = tsk;
|
||||||
if (ctn.full_name == "PABCSystem.BinaryFile")
|
if (ctn.full_name == "PABCSystem.BinaryFile")
|
||||||
ctn.type_special_kind = SemanticTree.type_special_kind.binary_file;
|
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)
|
if (type_is_generic_definition)
|
||||||
{
|
{
|
||||||
foreach (common_type_node par in type_params)
|
foreach (common_type_node par in type_params)
|
||||||
|
|
@ -2219,14 +2223,11 @@ namespace PascalABCCompiler.PCU
|
||||||
ReadTypeParameterEliminations(par);
|
ReadTypeParameterEliminations(par);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
type_node elemnet_type = null;
|
type_node element_type = null;
|
||||||
if (CanReadObject())
|
if (CanReadObject())
|
||||||
elemnet_type = GetTypeReference();
|
element_type = GetTypeReference();
|
||||||
ctn.element_type = elemnet_type;
|
ctn.element_type = element_type;
|
||||||
if (ctn.type_special_kind != SemanticTree.type_special_kind.set_type)
|
|
||||||
{
|
|
||||||
SystemLibrary.SystemLibrary.init_reference_type(ctn);
|
|
||||||
}
|
|
||||||
if (ctn.type_special_kind == SemanticTree.type_special_kind.set_type)
|
if (ctn.type_special_kind == SemanticTree.type_special_kind.set_type)
|
||||||
{
|
{
|
||||||
ctn = compilation_context.AddTypeToSetTypeList(ctn);
|
ctn = compilation_context.AddTypeToSetTypeList(ctn);
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ using System.Runtime.InteropServices;
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("Localization")]
|
[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: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ using System.Runtime.CompilerServices;
|
||||||
[assembly: AssemblyDelaySign(false)]
|
[assembly: AssemblyDelaySign(false)]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("PascalABC.NET Compiler")]
|
[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: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
[assembly: AssemblyVersion(RevisionClass.FullVersion)]
|
[assembly: AssemblyVersion(RevisionClass.FullVersion)]
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ using System.Runtime.CompilerServices;
|
||||||
[assembly: AssemblyDelaySign(false)]
|
[assembly: AssemblyDelaySign(false)]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("PascalABC.NET Compiler")]
|
[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: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
[assembly: AssemblyVersion(RevisionClass.FullVersion)]
|
[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)
|
__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)
|
__kernel void MatrMltMatr(__global double* A, __global double* B, __global double* C, int W)
|
||||||
|
|
|
||||||
|
|
@ -13,11 +13,11 @@ uses OpenGL;
|
||||||
|
|
||||||
{$apptype windows} // убирает консоль
|
{$apptype windows} // убирает консоль
|
||||||
|
|
||||||
var gl: OpenGL.gl;
|
var gl: OpenGL.gl<PlWin>;
|
||||||
|
|
||||||
{$region Shader}
|
{$region Shader}
|
||||||
|
|
||||||
function InitShader(fname: string; st: ShaderType): ShaderName;
|
function InitShader(fname: string; st: ShaderType): gl_shader;
|
||||||
begin
|
begin
|
||||||
Result := gl.CreateShader(st);
|
Result := gl.CreateShader(st);
|
||||||
|
|
||||||
|
|
@ -61,12 +61,12 @@ end;
|
||||||
|
|
||||||
{$region Program}
|
{$region Program}
|
||||||
|
|
||||||
function InitProgram(vertex_shader, fragment_shader: ShaderName): ProgramName;
|
function InitProgram(vertex_shader, fragment_shader: gl_shader): gl_program;
|
||||||
begin
|
begin
|
||||||
Result := gl.CreateProgram;
|
Result := gl.CreateProgram;
|
||||||
|
|
||||||
gl.AttachShader(Result, vertex_shader);
|
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);
|
gl.LinkProgram(Result);
|
||||||
// всё то же самое что и у шейдеров
|
// всё то же самое что и у шейдеров
|
||||||
|
|
@ -113,13 +113,13 @@ begin
|
||||||
|
|
||||||
// При создании экземпляра OpenGL.gl инициализируются некоторые функции
|
// При создании экземпляра OpenGL.gl инициализируются некоторые функции
|
||||||
// Это необходимо для всех функций из OpenGL1.2 и выше, потому что они локальны для контекста OpenGL
|
// Это необходимо для всех функций из OpenGL1.2 и выше, потому что они локальны для контекста OpenGL
|
||||||
gl := new OpenGL.gl;
|
gl := new OpenGL.gl<PlWin>;
|
||||||
|
|
||||||
{$endregion Настройка глобальных параметров OpenGL}
|
{$endregion Настройка глобальных параметров OpenGL}
|
||||||
|
|
||||||
{$region Инициализация переменных}
|
{$region Инициализация переменных}
|
||||||
|
|
||||||
var vertex_pos_buffer: BufferName;
|
var vertex_pos_buffer: gl_buffer;
|
||||||
gl.CreateBuffers(1, vertex_pos_buffer);
|
gl.CreateBuffers(1, vertex_pos_buffer);
|
||||||
gl.NamedBufferData(
|
gl.NamedBufferData(
|
||||||
vertex_pos_buffer,
|
vertex_pos_buffer,
|
||||||
|
|
@ -137,7 +137,7 @@ begin
|
||||||
VertexBufferObjectUsage.STATIC_DRAW
|
VertexBufferObjectUsage.STATIC_DRAW
|
||||||
);
|
);
|
||||||
|
|
||||||
var vertex_clr_buffer: BufferName;
|
var vertex_clr_buffer: gl_buffer;
|
||||||
gl.CreateBuffers(1, vertex_clr_buffer);
|
gl.CreateBuffers(1, vertex_clr_buffer);
|
||||||
gl.NamedBufferData(
|
gl.NamedBufferData(
|
||||||
vertex_clr_buffer,
|
vertex_clr_buffer,
|
||||||
|
|
@ -150,7 +150,7 @@ begin
|
||||||
VertexBufferObjectUsage.STATIC_DRAW
|
VertexBufferObjectUsage.STATIC_DRAW
|
||||||
);
|
);
|
||||||
|
|
||||||
var element_buffer: BufferName;
|
var element_buffer: gl_buffer;
|
||||||
gl.CreateBuffers(1, element_buffer);
|
gl.CreateBuffers(1, element_buffer);
|
||||||
gl.NamedBufferData(
|
gl.NamedBufferData(
|
||||||
element_buffer,
|
element_buffer,
|
||||||
|
|
@ -164,7 +164,7 @@ begin
|
||||||
var vertex_shader := InitShader('Rot Triangle 1.vertex.glsl', ShaderType.VERTEX_SHADER);
|
var vertex_shader := InitShader('Rot Triangle 1.vertex.glsl', ShaderType.VERTEX_SHADER);
|
||||||
// var fragment_shader := InitShader('fragment.glsl', ShaderType.FRAGMENT_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');
|
var uniform_rot_k := gl.GetUniformLocation(sprog, 'rot_k');
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -916,7 +916,7 @@ window.onload = ()=>{
|
||||||
</div>
|
</div>
|
||||||
<script>on_page_added(document.getElementById("page-1"))</script>
|
<script>on_page_added(document.getElementById("page-1"))</script>
|
||||||
<div id="page-2" page_name="О неуправляемых .dll" hidden=true>
|
<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>Если в кратце:</p>
|
||||||
<p>Есть платформа .Net, объединяющая много языков программирования. В том числе C# и PascalABC.NET.</p>
|
<p>Есть платформа .Net, объединяющая много языков программирования. В том числе C# и PascalABC.NET.</p>
|
||||||
<p>.exe и .dll созданные такими языками содержат код в особом виде, позволяющем легко подключать
|
<p>.exe и .dll созданные такими языками содержат код в особом виде, позволяющем легко подключать
|
||||||
|
|
@ -939,7 +939,7 @@ window.onload = ()=>{
|
||||||
<p>Чтоб чистить подпрограммы было проще - я написал несколько инструментов.
|
<p>Чтоб чистить подпрограммы было проще - я написал несколько инструментов.
|
||||||
Вся упаковка н.у. модулей находится <a href="https://github.com/SunSerega/POCGL/tree/master/Packing/Template">тут</a>.
|
Вся упаковка н.у. модулей находится <a href="https://github.com/SunSerega/POCGL/tree/master/Packing/Template">тут</a>.
|
||||||
Откройте папку <code>OpenCL</code> или <code>OpenGL</code>. Они устроены одинаково, поэтому объяснять можно на любой из них.</p>
|
Откройте папку <code>OpenCL</code> или <code>OpenGL</code>. Они устроены одинаково, поэтому объяснять можно на любой из них.</p>
|
||||||
<p>Все файлы (кроме .exe и .pdb, которые создаёт паскаль) в
|
<p>Все файлы (кроме .exe, .pdb и .pcu, которые создаёт паскаль) в
|
||||||
этих папках открываются любым текстовым редактором.</p>
|
этих папках открываются любым текстовым редактором.</p>
|
||||||
<hr />
|
<hr />
|
||||||
<h3>Fixers</h3>
|
<h3>Fixers</h3>
|
||||||
|
|
@ -964,7 +964,7 @@ window.onload = ()=>{
|
||||||
<hr />
|
<hr />
|
||||||
<p>Чтоб применить фиксеры и посмотреть на что они влияют - вызывайте <code>Pack Most.pas</code>.</p>
|
<p>Чтоб применить фиксеры и посмотреть на что они влияют - вызывайте <code>Pack Most.pas</code>.</p>
|
||||||
<p>Ну а чтоб полностью собрать модули - вызывайте <code>PackAll.exe</code> в корне репозитория.<br />
|
<p>Ну а чтоб полностью собрать модули - вызывайте <code>PackAll.exe</code> в корне репозитория.<br />
|
||||||
(или <code>.bat</code> файлы там же, для сборки отдельно 1 модуля)</p>
|
(или <code>.bat</code> файлы там же, для сборки отдельных компонентов)</p>
|
||||||
</div>
|
</div>
|
||||||
<script>on_page_added(document.getElementById("page-3"))</script>
|
<script>on_page_added(document.getElementById("page-3"))</script>
|
||||||
<script>on_end_folder()</script>
|
<script>on_end_folder()</script>
|
||||||
|
|
@ -998,12 +998,12 @@ window.onload = ()=>{
|
||||||
<p>Имена объектов - это числа (в OpenGL обычно на 32 бита, в OpenCL - зависит от битности системы).</p>
|
<p>Имена объектов - это числа (в OpenGL обычно на 32 бита, в OpenCL - зависит от битности системы).</p>
|
||||||
<p>Чтоб в подпрограмму, принимающую имена объектов определённого типа нельзя было передать имя
|
<p>Чтоб в подпрограмму, принимающую имена объектов определённого типа нельзя было передать имя
|
||||||
объекта неправильного типа - в н.у. модулях для каждого типа объектов описана подобная запись:</p>
|
объекта неправильного типа - в н.у. модулях для каждого типа объектов описана подобная запись:</p>
|
||||||
<pre><code> BufferName = record
|
<pre><code> gl_buffer = record
|
||||||
public val: UInt32;
|
public val: UInt32;
|
||||||
public constructor(val: UInt32) := self.val := val;
|
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 static property Size: integer read Marshal.SizeOf&<UInt32>;
|
||||||
public function ToString: string; override := $'BufferName[{val}]';
|
public function ToString: string; override := $'gl_buffer[{val}]';
|
||||||
end;
|
end;
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Такой подход не замедляет готовую программу, но позволяет отловить некоторые ошибки на этапе компиляции.</p>
|
<p>Такой подход не замедляет готовую программу, но позволяет отловить некоторые ошибки на этапе компиляции.</p>
|
||||||
|
|
@ -1012,8 +1012,8 @@ window.onload = ()=>{
|
||||||
<p>В обычной ситуации - вы будете взаимодействовать с именами только 3 способами:</p>
|
<p>В обычной ситуации - вы будете взаимодействовать с именами только 3 способами:</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li><p>Объявление:</p>
|
<li><p>Объявление:</p>
|
||||||
<pre><code>var name: BufferName;
|
<pre><code>var name: gl_buffer;
|
||||||
var names: array of BufferName := new BufferName[5];
|
var names: array of gl_buffer := new gl_buffer[5];
|
||||||
</code></pre>
|
</code></pre>
|
||||||
</li>
|
</li>
|
||||||
<li><p>Передача исходным библиотекам:</p>
|
<li><p>Передача исходным библиотекам:</p>
|
||||||
|
|
@ -1022,14 +1022,14 @@ gl.CreateBuffers(names.Length, names);
|
||||||
</code></pre>
|
</code></pre>
|
||||||
</li>
|
</li>
|
||||||
<li><p>Использование статичного свойства <code>.Zero</code>:</p>
|
<li><p>Использование статичного свойства <code>.Zero</code>:</p>
|
||||||
<pre><code>procedure MyProc(buff: BufferName);
|
<pre><code>procedure MyProc(buff: gl_buffer);
|
||||||
begin
|
begin
|
||||||
...
|
...
|
||||||
end;
|
end;
|
||||||
...
|
...
|
||||||
MyProc(BufferName.Zero);
|
MyProc(gl_buffer.Zero);
|
||||||
// Это то же самое, но с лишними скобками
|
// То же самое, но с лишними скобками:
|
||||||
MyProc(default(BufferName));
|
MyProc(default(gl_buffer));
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>У настоящих объектов имя никогда не будет нулевым.</p>
|
<p>У настоящих объектов имя никогда не будет нулевым.</p>
|
||||||
<p>Но бывает не мало случаев когда исходные библиотеки могут принимать нулевое имя.<br />
|
<p>Но бывает не мало случаев когда исходные библиотеки могут принимать нулевое имя.<br />
|
||||||
|
|
@ -1042,7 +1042,7 @@ MyProc(default(BufferName));
|
||||||
<p>Многие параметры подпрограмм в исходных библиотеках принимают перечисления (enum'ы).</p>
|
<p>Многие параметры подпрограмм в исходных библиотеках принимают перечисления (enum'ы).</p>
|
||||||
<p>Перечисления, как и имена, это числа. Но в отличии от имён - перечисления принимают заданные заранее константные значения.</p>
|
<p>Перечисления, как и имена, это числа. Но в отличии от имён - перечисления принимают заданные заранее константные значения.</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>
|
</code></pre>
|
||||||
<p>Параметр <code>target</code> принимает одно из значений, сгрупированных в записи <code>QueryTarget</code>:</p>
|
<p>Параметр <code>target</code> принимает одно из значений, сгрупированных в записи <code>QueryTarget</code>:</p>
|
||||||
<pre><code> QueryTarget = record
|
<pre><code> QueryTarget = record
|
||||||
|
|
@ -1076,7 +1076,7 @@ MyProc(default(BufferName));
|
||||||
end;
|
end;
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>То есть вызов может выглядеть так:</p>
|
<p>То есть вызов может выглядеть так:</p>
|
||||||
<pre><code>var name: QueryName;
|
<pre><code>var name: gl_query;
|
||||||
...
|
...
|
||||||
gl.BeginQuery(QueryTarget.VERTICES_SUBMITTED, name);
|
gl.BeginQuery(QueryTarget.VERTICES_SUBMITTED, name);
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
|
@ -1087,15 +1087,10 @@ gl.BeginQuery(QueryTarget.VERTICES_SUBMITTED, name);
|
||||||
<pre><code>procedure gl.Clear(mask: ClearBufferMask);
|
<pre><code>procedure gl.Clear(mask: ClearBufferMask);
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<pre><code>gl.Clear(
|
<pre><code>gl.Clear(
|
||||||
ClearBufferMask.COLOR_BUFFER_BIT or // очистка поверхности рисования одним цветом
|
ClearBufferMask.COLOR_BUFFER_BIT + // Очистка поверхности рисования одним цветом
|
||||||
ClearBufferMask.DEPTH_BUFFER_BIT // очистка буфера глубины - обязательна при рисовании 3D
|
ClearBufferMask.DEPTH_BUFFER_BIT // Очистка буфера глубины - нужна при рисовании 3D
|
||||||
);
|
);
|
||||||
</code></pre>
|
</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>
|
|
||||||
</div>
|
</div>
|
||||||
<script>on_page_added(document.getElementById("page-6"))</script>
|
<script>on_page_added(document.getElementById("page-6"))</script>
|
||||||
<div id="page-7" page_name="Классы-контейнеры подпрограмм" hidden=true>
|
<div id="page-7" page_name="Классы-контейнеры подпрограмм" hidden=true>
|
||||||
|
|
@ -1107,12 +1102,18 @@ gl.BeginQuery(QueryTarget.VERTICES_SUBMITTED, name);
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>По нажатию точки после <code>cl</code> вам так же покажет список всех функций в ядре OpenCL.</p>
|
<p>По нажатию точки после <code>cl</code> вам так же покажет список всех функций в ядре OpenCL.</p>
|
||||||
<hr />
|
<hr />
|
||||||
<p>С OpenGL немного сложнее: в каждом контексте у каждой подпрограммы может быть свой адрес.
|
<p>С OpenGL немного сложнее:</p>
|
||||||
Поэтому подпрограммы надо получать в зависимости от контекста. В модуле <code>OpenGL</code> это реализовано так:</p>
|
<ol>
|
||||||
<pre><code>//ToDo создание контекста и привязка его к текущему потоку
|
<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
|
while true do
|
||||||
begin
|
begin
|
||||||
|
|
@ -1126,27 +1127,28 @@ end;
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<hr />
|
<hr />
|
||||||
<p>У каждого расширения есть свой класс. К примеру, так используется расширение <code>GL_AMD_debug_output</code>:</p>
|
<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(...);
|
glDebugOutputAMD.DebugMessageEnableAMD(...);
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<hr />
|
<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>
|
<ul>
|
||||||
<li><p><code>gdi</code> содержит несколько методов библиотеки <code>gdi32.dll</code>. На этой библиотеке основано всё в <code>System.Windows.Forms</code>.<br />
|
<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>
|
||||||
<li><p><code>wgl</code> содержит методы для работы с OpenGL на Windows. Для других ОС есть класс <code>glX</code>, но он сейчас выключен из релиза.
|
<li><p><code>wgl</code> содержит методы для подключения OpenGL к окну Windows.</p>
|
||||||
Это потому, что у меня нет компьютера, на котором установлена другая ОС, а значит я не могу
|
</li>
|
||||||
заняться тестированием чтоб узнать как правильно объявлять всё в этом классе. Если у вас есть
|
<li><p><code>glx</code> содержит методы для подключения OpenGL к окну XWindow.</p>
|
||||||
другая ОС и вы хотите помочь мне разобраться - пожалуйста, свяжитесь со мной (желательно в issue).</p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Оба этих класса работают как класс <code>cl</code>, то есть им <strong>не</strong> надо создавать экземпляр.</p>
|
<p>Оба этих класса работают как класс <code>cl</code>, то есть им <strong>не</strong> надо создавать экземпляр.</p>
|
||||||
<hr />
|
<hr />
|
||||||
<p>И последнее что вам надо знать об этих классах: Если вы получаете <code>NullReferenceException</code>:</p>
|
<p>И последнее что вам надо знать об этих классах:<br />
|
||||||
|
Если вы получаете <code>NullReferenceException</code>,
|
||||||
|
при попытке вызова функции из инициализируемых классов, как <code>gl</code>:</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li><p>Скорее всего вы попытались вызвать подпрограмму, которой нет в реализации библиотеки на вашем компьютере.<br />
|
<li><p>Скорее всего вы попытались вызвать подпрограмму, которой нет в реализации библиотеки на вашем компьютере.<br />
|
||||||
Проверьте версию библиотеки, или, если это подпрограмма из расширения - проверьте существование у вас этого расширения.</p>
|
Проверьте версию библиотеки, или, если это подпрограмма из расширения - проверьте существование у вас этого расширения.</p>
|
||||||
|
|
@ -1270,25 +1272,29 @@ v2.Println;
|
||||||
v2.SqrLength.Sqrt.Println; // Обязательно будет 1
|
v2.SqrLength.Sqrt.Println; // Обязательно будет 1
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<h3>Cross</h3>
|
<h3>Cross</h3>
|
||||||
<p>Статичный метод <code>.Cross</code> возвращает произведение векторов (Cross product, не путать со скалярным произведением).
|
<p>Статичные методы <code>.Cross[CW,CCW]</code> возвращают векторное произведение двух
|
||||||
|
3-х мерных векторов ("Cross product", не путать со скалярным произведением).<br />
|
||||||
Векторное произведение - это вектор, перпендикулярный обоим входным векторам и имеющий длину,
|
Векторное произведение - это вектор, перпендикулярный обоим входным векторам и имеющий длину,
|
||||||
равную площади параллелограмма, образованного входными векторами.</p>
|
равную площади параллелограмма, образованного входными векторами.</p>
|
||||||
<p>Работает только для 3-х мерных векторов.</p>
|
<p>Не работает для векторов с элементами-беззнаковыми_целыми, потому что даёт переполнение
|
||||||
<p>И не работает для векторов с элементами-беззнаковыми целыми.<br />
|
на практически любых входных значениях. Если найдёте нормальное применение - напишите в issue.</p>
|
||||||
(потому что даёт переполнение на практически любых входных значениях. Если найдёте нормальное применение - напишите в issue).</p>
|
|
||||||
<p>В математике произведение векторов может вернуть один из двух противоположных друг-другу векторов,
|
<p>В математике произведение векторов может вернуть один из двух противоположных друг-другу векторов,
|
||||||
в зависимости от ориентации системы координат. В модуле <code>OpenGL</code> это решено следующим образом:</p>
|
в зависимости от ориентации системы координат. В модуле <code>OpenGL</code> это решено следующим образом:</p>
|
||||||
<pre><code>var c := Vec3d.Cross(a, b);
|
|
||||||
</code></pre>
|
|
||||||
<p>В данном случае, вектор <code>c</code> будет такой, чтоб соблюдалось следующее условие:</p>
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Если поставить начала всех 3 векторов в точку (0;0;0), а камеру в точку (a+b+c) и направить
|
<li><p><code>Vec3d.CrossCW(new Vec3d(1,0,0), new Vec3d(0,1,0)) = new Vec3d(0,0,1)</code>.</p>
|
||||||
в точку (0;0;0) - вектора a, b и c будут расположены по часовой стрелке вокруг центра экрана.</li>
|
</li>
|
||||||
|
<li><p><code>Vec3d.CrossCCW(a,b) = -Vec3d.CrossCW(a,b)</code>;</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Если надо чтоб было против часовой стрелки - можно использовать CCW (counter clock wise, против часовой стрелки) версию <code>.Cross</code>:</p>
|
<h3>Ввод с клавиатуры</h3>
|
||||||
<pre><code>var c := Vec3d.CrossCCW(a,b);
|
<p>Статичные методы <code>Read</code> и <code>Readln</code> создают новый вектор из элементов, прочитанных из стандартного ввода:</p>
|
||||||
|
<pre><code>// Прочитать 2 числа из ввода
|
||||||
|
Vec2d.Read('Введите 2 координаты:').Println;
|
||||||
|
|
||||||
|
// Прочитать 2 числа из ввода
|
||||||
|
// и затем пропустить всё до конца строки
|
||||||
|
Vec2d.Readln.Println;
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>(ну или можно использовать <code>-Vec3d.Cross(a,b)</code>, это даст тот же результат но с 1 лишней операцией)</p>
|
|
||||||
<h3>Превращение в строку</h3>
|
<h3>Превращение в строку</h3>
|
||||||
<pre><code>var v1: Vec4d;
|
<pre><code>var v1: Vec4d;
|
||||||
...
|
...
|
||||||
|
|
@ -1438,6 +1444,19 @@ m.Transpose.Println; // Выводит:
|
||||||
<code>v*m</code> это то же самое что <code>m.Transpose*v</code>.</p>
|
<code>v*m</code> это то же самое что <code>m.Transpose*v</code>.</p>
|
||||||
<h3>Умножение 2 матриц</h3>
|
<h3>Умножение 2 матриц</h3>
|
||||||
<p><code>m1*m2</code> - это математическое умножение матриц <code>m1</code> и <code>m2</code>.</p>
|
<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>
|
<h3>Превращение в строку</h3>
|
||||||
<p>Как и у векторов - матрицы можно выводить и превращать в строку</p>
|
<p>Как и у векторов - матрицы можно выводить и превращать в строку</p>
|
||||||
<pre><code>var m: Mtr4d;
|
<pre><code>var m: Mtr4d;
|
||||||
|
|
@ -1814,10 +1833,16 @@ begin
|
||||||
d.DynamicInvoke(5); // вообще .DynamicInvoke это очень медленно
|
d.DynamicInvoke(5); // вообще .DynamicInvoke это очень медленно
|
||||||
|
|
||||||
var p: integer->();
|
var p: integer->();
|
||||||
// var p: Action<integer>; // такое же объявление как на предыдущей строчке, но в другом стиле
|
// Такое же объявление как на предыдущей строчке, но в другом стиле
|
||||||
|
// var p: Action<integer>;
|
||||||
|
// И ещё один стиль. Этот особенный, потому что
|
||||||
|
// он неявно создаёт новый тип делегата
|
||||||
|
// var p: procedure(i: integer);
|
||||||
p := p1;
|
p := p1;
|
||||||
|
|
||||||
p(5); // типизированные делегаты можно вызывать быстрее и проще, так же как обычные подпрограммы
|
// Типизированные делегаты можно вызывать быстрее и проще,
|
||||||
|
// так же как обычные подпрограммы
|
||||||
|
p(5);
|
||||||
|
|
||||||
end.
|
end.
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
|
@ -1851,7 +1876,7 @@ end.
|
||||||
<ol>
|
<ol>
|
||||||
<li><p><code>cl.SetEventCallback</code> вызывает свой коллбек тогда, когда посчитает нужным (но обычно после того как вызов <code>cl.SetEventCallback</code> завершился);</p>
|
<li><p><code>cl.SetEventCallback</code> вызывает свой коллбек тогда, когда посчитает нужным (но обычно после того как вызов <code>cl.SetEventCallback</code> завершился);</p>
|
||||||
</li>
|
</li>
|
||||||
<li><p>Делегаты - это классы. И на самом деле кроме самого адреса хранят ещё много всякой информации (как типы параметров);</p>
|
<li><p>Делегаты - это классы.</p>
|
||||||
</li>
|
</li>
|
||||||
<li><p>Сборщик мусора распоряжается памятью классов и удаляет их, тоже когда посчитает нужным.</p>
|
<li><p>Сборщик мусора распоряжается памятью классов и удаляет их, тоже когда посчитает нужным.</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
@ -1862,9 +1887,9 @@ end.
|
||||||
<p>Если сборщик мусора удалит делегат, а затем .dll попытается его вызвать -
|
<p>Если сборщик мусора удалит делегат, а затем .dll попытается его вызвать -
|
||||||
это приведёт или к ошибке доступа, или к моментальному беззвучному вылету.</p>
|
это приведёт или к ошибке доступа, или к моментальному беззвучному вылету.</p>
|
||||||
<p>Чтоб запретить сборщику мусора удалять делегать - нужно создать <code>GCHandle</code>, привязанный к нему.<br />
|
<p>Чтоб запретить сборщику мусора удалять делегать - нужно создать <code>GCHandle</code>, привязанный к нему.<br />
|
||||||
Но в отличии от массивов - <code>GCHandleType.Pinned</code> не нужно, потому что сборщик мусора может перемещать
|
Но в отличии от массивов - <code>GCHandleType.Pinned</code> не нужно, потому что сборщик мусора
|
||||||
в памяти данные о параметрах делегата, но не сам адрес (а он единственное что передаётся в .dll).
|
не может перемещать адрес исполняемого кода (а он единственное что передаётся в .dll).
|
||||||
Это потому что адрес хранится в виде указателя на неуправляемый код.</p>
|
Это потому, что этот адрес хранится в виде указателя на неуправляемый код.</p>
|
||||||
<pre><code>uses System.Runtime.InteropServices;
|
<pre><code>uses System.Runtime.InteropServices;
|
||||||
uses System;
|
uses System;
|
||||||
uses OpenCL;
|
uses OpenCL;
|
||||||
|
|
@ -1877,8 +1902,8 @@ begin
|
||||||
|
|
||||||
Writeln($'{ev} перешёл в состояние {st}');
|
Writeln($'{ev} перешёл в состояние {st}');
|
||||||
|
|
||||||
// в данном случае освобождать GCHandle станет можно тогда, когда делегат 1 раз выполнится,
|
// В данном случае освобождать GCHandle станет можно тогда, когда делегат 1 раз выполнится,
|
||||||
// а значит очень удобно поставить освобождение в конец самого делегата
|
// А значит очень удобно поставить освобождение в конец самого делегата
|
||||||
gc_hnd.Free;
|
gc_hnd.Free;
|
||||||
end;
|
end;
|
||||||
gc_hnd := GCHandle.Alloc(cb);
|
gc_hnd := GCHandle.Alloc(cb);
|
||||||
|
|
|
||||||
|
|
@ -1012,7 +1012,7 @@ end.
|
||||||
Неявные очереди всегда используют <code>Context.Default</code>.</p>
|
Неявные очереди всегда используют <code>Context.Default</code>.</p>
|
||||||
<p>Изначально этому свойству присваивается контекст, использующий GPU, если оно имеется,
|
<p>Изначально этому свойству присваивается контекст, использующий GPU, если оно имеется,
|
||||||
или любое другое устройство, поддерживающее OpenCL, если GPU отсутствует.</p>
|
или любое другое устройство, поддерживающее 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 поддерживается
|
Однако такая ситуация теоретически невозможна, потому что OpenCL поддерживается
|
||||||
всеми современными устройствами, занимающимися выводом изображения на экран.<br />
|
всеми современными устройствами, занимающимися выводом изображения на экран.<br />
|
||||||
Если <code>Context.Default = nil</code> - переустановите графические драйверы.</p>
|
Если <code>Context.Default = nil</code> - переустановите графические драйверы.</p>
|
||||||
|
|
@ -1025,8 +1025,8 @@ end.
|
||||||
<script>on_start_folder("Context", document.getElementById("page-6"))</script>
|
<script>on_start_folder("Context", document.getElementById("page-6"))</script>
|
||||||
<script>on_end_folder()</script>
|
<script>on_end_folder()</script>
|
||||||
<div id="page-7" page_name="" hidden=true>
|
<div id="page-7" page_name="" hidden=true>
|
||||||
<p>Программам, выпоняемым на GPU, неудобно использовать оперативную память.
|
<p>Программам, выпоняемые на GPU, не удобно использовать оперативную память.
|
||||||
Поэтому обычно надо выделять память на самОм GPU.<br />
|
Поэтому обычно надо выделять память на самом GPU.<br />
|
||||||
Объекты типа <code>Buffer</code> представляют такую область памяти.</p>
|
Объекты типа <code>Buffer</code> представляют такую область памяти.</p>
|
||||||
<hr />
|
<hr />
|
||||||
<p>Буфер создаётся конструктором (<code>new Buffer(...)</code>).</p>
|
<p>Буфер создаётся конструктором (<code>new Buffer(...)</code>).</p>
|
||||||
|
|
@ -1034,13 +1034,13 @@ end.
|
||||||
Если вызвать <code>Buffer.Init</code> 2 раза - память освободится и выделится заново.</p>
|
Если вызвать <code>Buffer.Init</code> 2 раза - память освободится и выделится заново.</p>
|
||||||
<p>Когда на GPU выделяется память - она <strong>НЕ</strong> очищается нулями, а значит содержит мусорные данные.</p>
|
<p>Когда на GPU выделяется память - она <strong>НЕ</strong> очищается нулями, а значит содержит мусорные данные.</p>
|
||||||
<p>Если метод <code>Buffer.Init</code> не был вызван до первой операции чтения/записи - он будет вызван автоматически.
|
<p>Если метод <code>Buffer.Init</code> не был вызван до первой операции чтения/записи - он будет вызван автоматически.
|
||||||
В таком случае в качестве контекста, в котором выделяется память, берётся тот,
|
В таком случае в качестве контекста в котором выделяется память берётся тот,
|
||||||
на котором вызвали <code>.BeginInvoke</code>, который запустил команду чтения/записи буфера.</p>
|
на котором вызвали <code>.BeginInvoke</code>, который запустил команду чтения/записи буфера.</p>
|
||||||
<p>Память на GPU можно моментально освободить, вызвав метод <code>Buffer.Dispose</code>.
|
<p>Память на GPU можно моментально освободить, вызвав метод <code>Buffer.Dispose</code>.
|
||||||
Но если снова использовать буфер, у которого освободили память, - память выделится заново.</p>
|
Но если снова использовать буфер, у которого освободили память - память выделится заново.</p>
|
||||||
<p>Если сборщик мусора удаляет объект типа <code>Buffer</code> - <code>.Dispose</code> вызывается автоматически.</p>
|
<p>Если сборщик мусора удаляет объект типа <code>Buffer</code> - <code>.Dispose</code> вызывается автоматически.</p>
|
||||||
<hr />
|
<hr />
|
||||||
<p>Но кроме выделения памяти GPU - OpenCL также позволяет выделять память внутри другого буфера.<br />
|
<p>Но кроме выделения памяти GPU - OpenCL так же позволяет выделять память внутри другого буфера.<br />
|
||||||
Для этого используется тип <code>SubBuffer</code>:</p>
|
Для этого используется тип <code>SubBuffer</code>:</p>
|
||||||
<pre><code>uses OpenCLABC;
|
<pre><code>uses OpenCLABC;
|
||||||
|
|
||||||
|
|
@ -1074,7 +1074,7 @@ var k := code['KernelName'];
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Тут <code>'KernelName'</code> — имя подпрограммы-kernel'а в исходном коде (регистр важен!).</p>
|
<p>Тут <code>'KernelName'</code> — имя подпрограммы-kernel'а в исходном коде (регистр важен!).</p>
|
||||||
<hr />
|
<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;
|
<pre><code>var code: ProgramCode;
|
||||||
...
|
...
|
||||||
var ks := code.GetAllKernels;
|
var ks := code.GetAllKernels;
|
||||||
|
|
@ -1230,7 +1230,7 @@ end.
|
||||||
Но потом вы добавите что то в совсем другой части программы, или запустите её на
|
Но потом вы добавите что то в совсем другой части программы, или запустите её на
|
||||||
другом компьютере и она вдруг начнёт выводить мусорные значения, или падать с ошибками
|
другом компьютере и она вдруг начнёт выводить мусорные значения, или падать с ошибками
|
||||||
вроде <code>AccessViolationException</code>, которые совершенно не объясняют в чём проблема.</p>
|
вроде <code>AccessViolationException</code>, которые совершенно не объясняют в чём проблема.</p>
|
||||||
<p>Если очень интересно, откуда берутся эти ограничения, начните с применения .Net декомпилятора к .exe файлам,
|
<p>Если очень интересно откуда берутся эти ограничения - начните с применения .Net декомпилятора к .exe файлам,
|
||||||
получаемым при компиляции программ с данной страницы. Что останется непонятно - можете спрашивать в issue.</p>
|
получаемым при компиляции программ с данной страницы. Что останется непонятно - можете спрашивать в issue.</p>
|
||||||
</div>
|
</div>
|
||||||
<script>on_start_folder("Kernel", document.getElementById("page-8"))</script>
|
<script>on_start_folder("Kernel", document.getElementById("page-8"))</script>
|
||||||
|
|
@ -1373,7 +1373,7 @@ except
|
||||||
on e: Exception do Writeln(e);
|
on e: Exception do Writeln(e);
|
||||||
end;
|
end;
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Для этого кода есть стандартный снипет. Чтобы активировать его, напишите <code>tryo</code> и нажмите Shift+Пробел.</p>
|
<p>Для этого кода есть стандартный снипет. Чтобы активировать его - напишите <code>tryo</code> и нажмите Shift+Пробел.</p>
|
||||||
</div>
|
</div>
|
||||||
<script>on_start_folder("Выполнение очередей", document.getElementById("page-14"))</script>
|
<script>on_start_folder("Выполнение очередей", document.getElementById("page-14"))</script>
|
||||||
<script>on_end_folder()</script>
|
<script>on_end_folder()</script>
|
||||||
|
|
|
||||||
|
|
@ -878,7 +878,7 @@ window.onload = ()=>{
|
||||||
<div id="page-1" page_name="" hidden=true>
|
<div id="page-1" page_name="" hidden=true>
|
||||||
<p><code>ToDo</code> модуль <code>OpenGLABC</code> пока что не существует. Когда то он появится, но пока что есть только это сообщение.</p>
|
<p><code>ToDo</code> модуль <code>OpenGLABC</code> пока что не существует. Когда то он появится, но пока что есть только это сообщение.</p>
|
||||||
<p>Если хотите понять, было ли это сообщение оставлено тут 10 лет назад и забыто - вот дата, когда автор сообщения последний раз прочитал его:<br />
|
<p>Если хотите понять, было ли это сообщение оставлено тут 10 лет назад и забыто - вот дата, когда автор сообщения последний раз прочитал его:<br />
|
||||||
03.08.2020</p>
|
2021.01.05</p>
|
||||||
</div>
|
</div>
|
||||||
<script>on_start_folder("GL ABC", document.getElementById("page-1"))</script>
|
<script>on_start_folder("GL ABC", document.getElementById("page-1"))</script>
|
||||||
<script>on_end_folder()</script>
|
<script>on_end_folder()</script>
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ using System.Runtime.InteropServices;
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("Localization")]
|
[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: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3353,8 +3353,8 @@ namespace PascalABCCompiler.NETGenerator
|
||||||
{
|
{
|
||||||
if (ti.init_meth != null)
|
if (ti.init_meth != null)
|
||||||
{
|
{
|
||||||
il.Emit(OpCodes.Ldloca, lb);
|
//il.Emit(OpCodes.Ldloca, lb);
|
||||||
il.Emit(OpCodes.Call, ti.init_meth);
|
//il.Emit(OpCodes.Call, ti.init_meth);
|
||||||
}
|
}
|
||||||
LocalBuilder llb = il.DeclareLocal(lb.LocalType.MakePointerType());
|
LocalBuilder llb = il.DeclareLocal(lb.LocalType.MakePointerType());
|
||||||
il.Emit(OpCodes.Ldloca, lb);
|
il.Emit(OpCodes.Ldloca, lb);
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ using System.Runtime.InteropServices;
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("Optimizer")]
|
[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: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ namespace PascalABCCompiler
|
||||||
|
|
||||||
public string Copyright
|
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
|
public PascalABCCompiler.SemanticTreeConverters.ConverterType ConverterType
|
||||||
|
|
|
||||||
|
|
@ -193,7 +193,7 @@ namespace PascalABCCompiler.DocTagsParser
|
||||||
{
|
{
|
||||||
get
|
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 Preprocessor2.Preprocessor2 preprocessor2 = new PascalABCCompiler.Preprocessor2.Preprocessor2(null);
|
||||||
|
|
||||||
public PascalABCNewLanguageParser()
|
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: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("VBNETParser")]
|
[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: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ using System.Runtime.InteropServices;
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("SyntaxTreeChanger")]
|
[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: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ using System.Runtime.InteropServices;
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("SyntaxVisitors")]
|
[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: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,5 +17,5 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Assert(1=1)
|
Assert(1=1);
|
||||||
end.
|
end.
|
||||||
|
|
@ -5,4 +5,16 @@
|
||||||
var w: word := 65535;
|
var w: word := 65535;
|
||||||
Assert(Sqr(w)=w*w);
|
Assert(Sqr(w)=w*w);
|
||||||
Assert(Abs(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.
|
end.
|
||||||
|
|
@ -8215,7 +8215,7 @@ function LogN(base, x: real) := Math.Log(x) / Math.Log(base);
|
||||||
|
|
||||||
function Sqrt(x: real) := Math.Sqrt(x);
|
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;
|
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: 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;
|
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
|
type
|
||||||
TRec = record a : integer; end;
|
TRec = record a : integer; end;
|
||||||
TRec2 = record b : array of real; end;
|
TRec2 = record b : array of real; end;
|
||||||
|
|
@ -51,6 +51,25 @@ Nested;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var i := 1;
|
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);
|
rec : TRec := (a:i+3);
|
||||||
arr : TMas := ((a:i),(a:i+1),(a:i+2));
|
arr : TMas := ((a:i),(a:i+1),(a:i+2));
|
||||||
arr2 : array of TRec := ((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');
|
assert(rec6.a='abcd');
|
||||||
Test;
|
Test;
|
||||||
Test2;
|
Test2;
|
||||||
|
Test3;
|
||||||
end.
|
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;
|
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);
|
return new default_operator_node(vdn.type, lid);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11974,6 +11974,8 @@ namespace PascalABCCompiler.TreeConverter
|
||||||
{
|
{
|
||||||
make_attributes_for_declaration(_type_declaration, ctn);
|
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 (is_generic)
|
||||||
{
|
{
|
||||||
if (predefined_generic)
|
if (predefined_generic)
|
||||||
|
|
@ -12011,6 +12013,7 @@ namespace PascalABCCompiler.TreeConverter
|
||||||
AddError(get_location(cl_def.class_parents.types[i]), "PARTIAL_CLASS_PARENTS_MISMATCH");
|
AddError(get_location(cl_def.class_parents.types[i]), "PARTIAL_CLASS_PARENTS_MISMATCH");
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
visit_where_list(cl_def.where_section);
|
visit_where_list(cl_def.where_section);
|
||||||
|
|
||||||
CheckWaitedRefTypes(ctn);
|
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);
|
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)
|
foreach (type_node interf in gpe.implementing_interfaces)
|
||||||
{
|
{
|
||||||
type_node di = generic_convertions.determine_type(interf, tparams, method_param_types);
|
type_node di = generic_convertions.determine_type(interf, tparams, method_param_types);
|
||||||
|
|
@ -309,6 +313,8 @@ namespace PascalABCCompiler.TreeRealization
|
||||||
//Определяем базовый тип
|
//Определяем базовый тип
|
||||||
type_node btype = determine_type(
|
type_node btype = determine_type(
|
||||||
original.base_type, param_types, false);
|
original.base_type, param_types, false);
|
||||||
|
if (btype == null)
|
||||||
|
btype = SystemLibrary.SystemLibrary.object_type;
|
||||||
instance.SetBaseTypeIgnoringScope(btype);
|
instance.SetBaseTypeIgnoringScope(btype);
|
||||||
|
|
||||||
//instance._scope = new SymbolTable.GenericTypeInstanceScope(instance, instance.original_generic.Scope, btype.Scope);
|
//instance._scope = new SymbolTable.GenericTypeInstanceScope(instance, instance.original_generic.Scope, btype.Scope);
|
||||||
|
|
|
||||||
|
|
@ -278,7 +278,12 @@ namespace PascalABCCompiler.TreeRealization
|
||||||
}
|
}
|
||||||
if (tn.is_generic_parameter)
|
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)
|
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.Name = "label12";
|
||||||
this.label12.Size = new System.Drawing.Size(311, 13);
|
this.label12.Size = new System.Drawing.Size(311, 13);
|
||||||
this.label12.TabIndex = 17;
|
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);
|
this.label12.Click += new System.EventHandler(this.label12_Click);
|
||||||
//
|
//
|
||||||
// label9
|
// label9
|
||||||
|
|
|
||||||
|
|
@ -130,7 +130,7 @@ namespace VisualPascalABC
|
||||||
if (comp != null)
|
if (comp != null)
|
||||||
{
|
{
|
||||||
Assembly a = Assembly.GetAssembly(comp.GetType());
|
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)
|
foreach (PascalABCCompiler.Parsers.IParser parser in comp.ParsersController.Parsers)
|
||||||
dgvModules.Items.Add(MakeItem("Parser",parser.Name, parser.Version, parser.Copyright));
|
dgvModules.Items.Add(MakeItem("Parser",parser.Name, parser.Version, parser.Copyright));
|
||||||
foreach (PascalABCCompiler.SemanticTreeConverters.ISemanticTreeConverter conv in comp.SemanticTreeConvertersController.SemanticTreeConverters)
|
foreach (PascalABCCompiler.SemanticTreeConverters.ISemanticTreeConverter conv in comp.SemanticTreeConvertersController.SemanticTreeConverters)
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ namespace VisualPascalABCPlugins
|
||||||
{
|
{
|
||||||
get
|
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: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("HelpBuilder")]
|
[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: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ namespace VisualPascalABCPlugins
|
||||||
{
|
{
|
||||||
get
|
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
|
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: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("ExtendedCompilerInformation")]
|
[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: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ namespace VisualPascalABCPlugins
|
||||||
{
|
{
|
||||||
get
|
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
|
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
|
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
|
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
|
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 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;
|
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: 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;
|
function Sqr(x: uint64): uint64 := x * x;
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -11,7 +11,8 @@ uses PascalABCCompiler, System.IO, System.Diagnostics;
|
||||||
|
|
||||||
var
|
var
|
||||||
TestSuiteDir: string;
|
TestSuiteDir: string;
|
||||||
|
nogui: boolean;
|
||||||
|
|
||||||
var
|
var
|
||||||
PathSeparator: string := Path.DirectorySeparatorChar;
|
PathSeparator: string := Path.DirectorySeparatorChar;
|
||||||
|
|
||||||
|
|
@ -56,13 +57,19 @@ begin
|
||||||
comp.Compile(co);
|
comp.Compile(co);
|
||||||
if comp.ErrorsList.Count = 0 then
|
if comp.ErrorsList.Count = 0 then
|
||||||
begin
|
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);
|
System.Windows.Forms.MessageBox.Show('Compilation of error sample ' + files[i] + ' was successfull' + System.Environment.NewLine);
|
||||||
Halt();
|
Halt();
|
||||||
end
|
end
|
||||||
else if comp.ErrorsList.Count = 1 then
|
else if comp.ErrorsList.Count = 1 then
|
||||||
begin
|
begin
|
||||||
if comp.ErrorsList[0].GetType() = typeof(PascalABCCompiler.Errors.CompilerInternalError) then
|
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());
|
System.Windows.Forms.MessageBox.Show('Compilation of ' + files[i] + ' failed' + System.Environment.NewLine + comp.ErrorsList[0].ToString());
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
if i mod 50 = 0 then
|
if i mod 50 = 0 then
|
||||||
System.GC.Collect();
|
System.GC.Collect();
|
||||||
|
|
@ -96,6 +103,8 @@ begin
|
||||||
comp.Compile(co);
|
comp.Compile(co);
|
||||||
if comp.ErrorsList.Count > 0 then
|
if comp.ErrorsList.Count > 0 then
|
||||||
begin
|
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());
|
System.Windows.Forms.MessageBox.Show('Compilation of ' + files[i] + ' failed' + System.Environment.NewLine + comp.ErrorsList[0].ToString());
|
||||||
Halt();
|
Halt();
|
||||||
end;
|
end;
|
||||||
|
|
@ -130,6 +139,8 @@ begin
|
||||||
comp.Compile(co);
|
comp.Compile(co);
|
||||||
if comp.ErrorsList.Count > 0 then
|
if comp.ErrorsList.Count > 0 then
|
||||||
begin
|
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());
|
System.Windows.Forms.MessageBox.Show('Compilation of ' + files[i] + ' failed' + System.Environment.NewLine + comp.ErrorsList[0].ToString());
|
||||||
Halt();
|
Halt();
|
||||||
end;
|
end;
|
||||||
|
|
@ -159,6 +170,8 @@ begin
|
||||||
comp.Compile(co);
|
comp.Compile(co);
|
||||||
if comp.ErrorsList.Count > 0 then
|
if comp.ErrorsList.Count > 0 then
|
||||||
begin
|
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());
|
System.Windows.Forms.MessageBox.Show('Compilation of ' + files[i] + ' failed' + System.Environment.NewLine + comp.ErrorsList[0].ToString());
|
||||||
Halt();
|
Halt();
|
||||||
end;
|
end;
|
||||||
|
|
@ -186,6 +199,8 @@ begin
|
||||||
comp.Compile(co);
|
comp.Compile(co);
|
||||||
if comp.ErrorsList.Count > 0 then
|
if comp.ErrorsList.Count > 0 then
|
||||||
begin
|
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());
|
System.Windows.Forms.MessageBox.Show('Compilation of ' + files[i] + ' failed' + System.Environment.NewLine + comp.ErrorsList[0].ToString());
|
||||||
Halt();
|
Halt();
|
||||||
end;
|
end;
|
||||||
|
|
@ -230,11 +245,22 @@ begin
|
||||||
p.StandardInput.WriteLine('GO');
|
p.StandardInput.WriteLine('GO');
|
||||||
//p.StandardInput.AutoFlush := true;
|
//p.StandardInput.AutoFlush := true;
|
||||||
//var p := System.Diagnostics.Process.Start(psi);
|
//var p := System.Diagnostics.Process.Start(psi);
|
||||||
|
if nogui then
|
||||||
while not p.HasExited do
|
begin
|
||||||
Sleep(10);
|
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
|
if p.ExitCode <> 0 then
|
||||||
begin
|
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');
|
System.Windows.Forms.MessageBox.Show('Running of ' + files[i] + ' failed. Exit code is not 0');
|
||||||
Halt;
|
Halt;
|
||||||
end;
|
end;
|
||||||
|
|
@ -344,17 +370,21 @@ begin
|
||||||
try
|
try
|
||||||
TestSuiteDir := GetTestSuiteDir;
|
TestSuiteDir := GetTestSuiteDir;
|
||||||
System.Environment.CurrentDirectory := Path.GetDirectoryName(GetEXEFileName());
|
System.Environment.CurrentDirectory := Path.GetDirectoryName(GetEXEFileName());
|
||||||
|
if (ParamCount = 2) and (ParamStr(2) = '1') then
|
||||||
|
nogui := true;
|
||||||
if (ParamCount = 0) or (ParamStr(1) = '1') then
|
if (ParamCount = 0) or (ParamStr(1) = '1') then
|
||||||
begin
|
begin
|
||||||
DeletePCUFiles;
|
DeletePCUFiles;
|
||||||
ClearExeDir;
|
ClearExeDir;
|
||||||
CompileAllRunTests(false);
|
CompileAllRunTests(false);
|
||||||
|
writeln('Tests to run: '+Milliseconds()+'ms');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if (ParamCount = 0) or (ParamStr(1) = '2') then
|
if (ParamCount = 0) or (ParamStr(1) = '2') then
|
||||||
begin
|
begin
|
||||||
CopyLibFiles;
|
CopyLibFiles;
|
||||||
CompileAllCompilationTests('CompilationSamples', false);
|
CompileAllCompilationTests('CompilationSamples', false);
|
||||||
|
writeln('CompilationSamples: '+Milliseconds()+'ms');
|
||||||
end;
|
end;
|
||||||
if (ParamCount = 0) or (ParamStr(1) = '3') then
|
if (ParamCount = 0) or (ParamStr(1) = '3') then
|
||||||
begin
|
begin
|
||||||
|
|
@ -362,12 +392,12 @@ begin
|
||||||
CopyPCUFiles;
|
CopyPCUFiles;
|
||||||
CompileAllUsesUnits;
|
CompileAllUsesUnits;
|
||||||
CompileErrorTests(false);
|
CompileErrorTests(false);
|
||||||
writeln('Tests compiled successfully');
|
writeln('Other tests '+Milliseconds()+'ms'+'. Tests compiled successfully ');
|
||||||
end;
|
end;
|
||||||
if (ParamCount = 0) or (ParamStr(1) = '4') then
|
if (ParamCount = 0) or (ParamStr(1) = '4') then
|
||||||
begin
|
begin
|
||||||
RunAllTests(false);
|
RunAllTests(false);
|
||||||
writeln('Tests run successfully');
|
writeln('Tests run successfully: '+Milliseconds()+'ms');
|
||||||
ClearExeDir;
|
ClearExeDir;
|
||||||
DeletePCUFiles;
|
DeletePCUFiles;
|
||||||
end;
|
end;
|
||||||
|
|
@ -397,6 +427,11 @@ begin
|
||||||
end;
|
end;
|
||||||
except
|
except
|
||||||
on e: Exception do
|
on e: Exception do
|
||||||
|
begin
|
||||||
|
if nogui then
|
||||||
|
raise new Exception(e.ToString());
|
||||||
assert(false, e.ToString());
|
assert(false, e.ToString());
|
||||||
|
end;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
end.
|
end.
|
||||||
|
|
@ -13,7 +13,7 @@ using System.Runtime.CompilerServices;
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("")]
|
[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: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -375,7 +375,7 @@ namespace PascalABCCompiler
|
||||||
DateTime ldt = DateTime.Now;
|
DateTime ldt = DateTime.Now;
|
||||||
Compiler = new PascalABCCompiler.Compiler(null,ChangeCompilerState);
|
Compiler = new PascalABCCompiler.Compiler(null,ChangeCompilerState);
|
||||||
//GC.Collect();
|
//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);
|
Console.WriteLine("OK {0}ms", (DateTime.Now - ldt).TotalMilliseconds);
|
||||||
if (Compiler.SupportedSourceFiles.Length == 0)
|
if (Compiler.SupportedSourceFiles.Length == 0)
|
||||||
WriteColorText(StringResourcesGet("ERROR_PARSERS_NOT_FOUND")+Environment.NewLine,ConsoleColor.Black,ConsoleColor.Red);
|
WriteColorText(StringResourcesGet("ERROR_PARSERS_NOT_FOUND")+Environment.NewLine,ConsoleColor.Black,ConsoleColor.Red);
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ using System.Runtime.CompilerServices;
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("")]
|
[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: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue