This commit is contained in:
Ivan Bondarev 2021-11-21 14:37:34 +01:00
parent dc9320cd90
commit 70d9fc52bb
3 changed files with 48 additions and 10 deletions

View file

@ -9033,11 +9033,13 @@ namespace PascalABCCompiler.NETGenerator
Label lb_true = il.DefineLabel();
Label lb_end = il.DefineLabel();
Label lb_common = il.DefineLabel();
LocalBuilder lb_left = il.DeclareLocal(ti_left.tp);
LocalBuilder lb_right = il.DeclareLocal(ti_right.tp);
LocalBuilder lb_left = null;
LocalBuilder lb_right = null;
if (!(real_parameters[0] is IDefaultOperatorNode) && !(real_parameters[1] is IDefaultOperatorNode))
{
is_dot_expr = true;
//is_dot_expr = true;
lb_left = il.DeclareLocal(ti_left.tp);
lb_right = il.DeclareLocal(ti_right.tp);
real_parameters[0].visit(this);
il.Emit(OpCodes.Stloc, lb_left);
il.Emit(OpCodes.Ldloca, lb_left);
@ -9049,7 +9051,7 @@ namespace PascalABCCompiler.NETGenerator
LocalBuilder tmp_lb = il.DeclareLocal(TypeFactory.BoolType);
il.Emit(OpCodes.Stloc, tmp_lb);
il.Emit(OpCodes.Ldloc, tmp_lb);
is_dot_expr = true;
//is_dot_expr = true;
real_parameters[1].visit(this);
il.Emit(OpCodes.Stloc, lb_right);
il.Emit(OpCodes.Ldloca, lb_right);
@ -9131,15 +9133,32 @@ namespace PascalABCCompiler.NETGenerator
if (!(real_parameters[0] is IDefaultOperatorNode))
{
is_dot_expr = true;
il.Emit(OpCodes.Ldloca, lb_left);
il.Emit(OpCodes.Call, mi_left);
if (lb_left != null)
{
il.Emit(OpCodes.Ldloca, lb_left);
il.Emit(OpCodes.Call, mi_left);
}
else
{
is_dot_expr = true;
real_parameters[0].visit(this);
il.Emit(OpCodes.Call, mi_left);
}
}
if (!(real_parameters[1] is IDefaultOperatorNode))
{
is_dot_expr = true;
il.Emit(OpCodes.Ldloca, lb_right);
il.Emit(OpCodes.Call, mi_right);
if (lb_right != null)
{
il.Emit(OpCodes.Ldloca, lb_right);
il.Emit(OpCodes.Call, mi_right);
}
else
{
is_dot_expr = true;
real_parameters[1].visit(this);
il.Emit(OpCodes.Call, mi_right);
}
}
MethodInfo eq_mi = null;
if (real_parameters[0].type is IGenericTypeInstance)

View file

@ -0,0 +1,11 @@
type
Container = record
val: integer;
end;
begin
var c: Container;
c.val := 2;
var s: sequence of Container := Arr(c);
assert(s.Max(a->a.val) = 2);
end.

View file

@ -2414,6 +2414,14 @@ namespace PascalABCCompiler.TreeRealization
}
}
public override bool is_extension_method
{
get
{
return _original_function.is_extension_method;
}
}
public override bool is_generic_function_instance
{
get