fix #2101
This commit is contained in:
parent
86c22b6c82
commit
b678e532b3
|
|
@ -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
BIN
TestSuite/ClassLibrary1.dll
Normal file
Binary file not shown.
15
TestSuite/records14.pas
Normal file
15
TestSuite/records14.pas
Normal 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.
|
||||
|
|
@ -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.
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue