This commit is contained in:
Ivan Bondarev 2020-12-26 18:05:31 +01:00
parent 86c22b6c82
commit b678e532b3
6 changed files with 68 additions and 7 deletions

View file

@ -8797,9 +8797,50 @@ namespace PascalABCCompiler.NETGenerator
bool tmp_dot = is_dot_expr;
IExpressionNode[] real_parameters = value.real_parameters;
is_dot_expr = false;
{
//(ssyy) 29.01.2008 Внёс band, bor под switch
basic_function_type ft = value.basic_function.basic_function_type;
if (ft == basic_function_type.objeq && real_parameters[0].type.is_value_type &&
real_parameters[0].type is ICompiledTypeNode && !NetHelper.NetHelper.IsStandType((real_parameters[0].type as ICompiledTypeNode).compiled_type) && !real_parameters[0].type.is_nullable_type
&& real_parameters[1].type.is_value_type &&
real_parameters[1].type is ICompiledTypeNode && !NetHelper.NetHelper.IsStandType((real_parameters[1].type as ICompiledTypeNode).compiled_type) && !real_parameters[1].type.is_nullable_type)
{
Type t1 = (real_parameters[0].type as ICompiledTypeNode).compiled_type;
Type t2 = (real_parameters[1].type as ICompiledTypeNode).compiled_type;
MethodInfo mi = (real_parameters[0].type as ICompiledTypeNode).compiled_type.GetMethod("Equals");
if (mi != null)
{
real_parameters[0].visit(this);
il.Emit(OpCodes.Box, t1);
real_parameters[1].visit(this);
il.Emit(OpCodes.Box, t2);
il.Emit(OpCodes.Callvirt, mi);
return;
}
}
if (ft == basic_function_type.objnoteq && real_parameters[0].type.is_value_type &&
real_parameters[0].type is ICompiledTypeNode && !NetHelper.NetHelper.IsStandType((real_parameters[0].type as ICompiledTypeNode).compiled_type) && !real_parameters[0].type.is_nullable_type
&& real_parameters[1].type.is_value_type &&
real_parameters[1].type is ICompiledTypeNode && !NetHelper.NetHelper.IsStandType((real_parameters[1].type as ICompiledTypeNode).compiled_type) && !real_parameters[1].type.is_nullable_type)
{
Type t1 = (real_parameters[0].type as ICompiledTypeNode).compiled_type;
Type t2 = (real_parameters[1].type as ICompiledTypeNode).compiled_type;
MethodInfo mi = (real_parameters[0].type as ICompiledTypeNode).compiled_type.GetMethod("Equals");
if (mi != null)
{
real_parameters[0].visit(this);
il.Emit(OpCodes.Box, t1);
real_parameters[1].visit(this);
il.Emit(OpCodes.Box, t2);
il.Emit(OpCodes.Callvirt, mi);
il.Emit(OpCodes.Ldc_I4_0);
il.Emit(OpCodes.Ceq);
return;
}
}
switch (ft)
{
case basic_function_type.booland:

BIN
TestSuite/ClassLibrary1.dll Normal file

Binary file not shown.

15
TestSuite/records14.pas Normal file
View file

@ -0,0 +1,15 @@
{$reference ClassLibrary1.dll}
var
a := new ClassLibrary1.Rec1(1, 2);
b := new ClassLibrary1.Rec1(1, 2);
c := new ClassLibrary1.Rec1(3, 4);
begin
assert(a = b);
assert(not (a <> b));
assert(a <> c);
assert(not (a = c));
var today := DateTime.Today;
assert(today = today);
end.

View file

@ -2221,19 +2221,19 @@ namespace PascalABCCompiler.SystemLibrary
return make_object_operator(ctn, SemanticTree.basic_function_type.objnoteq, compiler_string_consts.noteq_name, _bool_type);
}
public static void init_reference_type(type_node ctn)
public static void init_reference_type(type_node tn)
{
if (_bool_type == null)
{
wait_add_ref_list.Add(ctn);
wait_add_ref_list.Add(tn);
return;
}
if (!ctn.is_ref_inited)
if (!tn.is_ref_inited)
{
make_assign_operator(ctn);
make_equivalence_operator(ctn);
make_not_equivalence_operator(ctn);
ctn.is_ref_inited = true;
make_assign_operator(tn);
make_equivalence_operator(tn);
make_not_equivalence_operator(tn);
tn.is_ref_inited = true;
}
}

Binary file not shown.

View file

@ -206,6 +206,11 @@ end;
procedure RunAllTests(redirectIO: boolean);
begin
var dlls := Directory.GetFiles(TestSuiteDir, '*.dll');
foreach var dll in dlls do
begin
System.IO.File.Copy(dll, TestSuiteDir + PathSeparator + 'exe' + PathSeparator + Path.GetFileName(dll), true);
end;
var files := Directory.GetFiles(TestSuiteDir + PathSeparator + 'exe', '*.exe');
for var i := 0 to files.Length - 1 do
begin