This commit is contained in:
Ivan Bondarev 2021-11-21 14:10:06 +01:00
parent 91bef35399
commit dc9320cd90
3 changed files with 19 additions and 2 deletions

Binary file not shown.

View file

@ -8979,6 +8979,7 @@ namespace PascalABCCompiler.NETGenerator
real_parameters[0].visit(this); real_parameters[0].visit(this);
is_dot_expr = tmp; is_dot_expr = tmp;
MethodInfo mi = null; MethodInfo mi = null;
if (real_parameters[0].type is IGenericTypeInstance) if (real_parameters[0].type is IGenericTypeInstance)
mi = TypeBuilder.GetMethod(ti.tp, typeof(Nullable<>).GetMethod("get_HasValue")); mi = TypeBuilder.GetMethod(ti.tp, typeof(Nullable<>).GetMethod("get_HasValue"));
@ -9032,10 +9033,14 @@ namespace PascalABCCompiler.NETGenerator
Label lb_true = il.DefineLabel(); Label lb_true = il.DefineLabel();
Label lb_end = il.DefineLabel(); Label lb_end = il.DefineLabel();
Label lb_common = il.DefineLabel(); Label lb_common = il.DefineLabel();
LocalBuilder lb_left = il.DeclareLocal(ti_left.tp);
LocalBuilder lb_right = il.DeclareLocal(ti_right.tp);
if (!(real_parameters[0] is IDefaultOperatorNode) && !(real_parameters[1] is IDefaultOperatorNode)) if (!(real_parameters[0] is IDefaultOperatorNode) && !(real_parameters[1] is IDefaultOperatorNode))
{ {
is_dot_expr = true; is_dot_expr = true;
real_parameters[0].visit(this); real_parameters[0].visit(this);
il.Emit(OpCodes.Stloc, lb_left);
il.Emit(OpCodes.Ldloca, lb_left);
if (real_parameters[0].type is IGenericTypeInstance) if (real_parameters[0].type is IGenericTypeInstance)
mi_left = TypeBuilder.GetMethod(ti_left.tp, typeof(Nullable<>).GetMethod("get_HasValue", new Type[] { })); mi_left = TypeBuilder.GetMethod(ti_left.tp, typeof(Nullable<>).GetMethod("get_HasValue", new Type[] { }));
else else
@ -9046,6 +9051,8 @@ namespace PascalABCCompiler.NETGenerator
il.Emit(OpCodes.Ldloc, tmp_lb); il.Emit(OpCodes.Ldloc, tmp_lb);
is_dot_expr = true; is_dot_expr = true;
real_parameters[1].visit(this); real_parameters[1].visit(this);
il.Emit(OpCodes.Stloc, lb_right);
il.Emit(OpCodes.Ldloca, lb_right);
if (real_parameters[1].type is IGenericTypeInstance) if (real_parameters[1].type is IGenericTypeInstance)
mi_right = TypeBuilder.GetMethod(ti_right.tp, typeof(Nullable<>).GetMethod("get_HasValue", new Type[] { })); mi_right = TypeBuilder.GetMethod(ti_right.tp, typeof(Nullable<>).GetMethod("get_HasValue", new Type[] { }));
else else
@ -9125,13 +9132,13 @@ namespace PascalABCCompiler.NETGenerator
if (!(real_parameters[0] is IDefaultOperatorNode)) if (!(real_parameters[0] is IDefaultOperatorNode))
{ {
is_dot_expr = true; is_dot_expr = true;
real_parameters[0].visit(this); il.Emit(OpCodes.Ldloca, lb_left);
il.Emit(OpCodes.Call, mi_left); il.Emit(OpCodes.Call, mi_left);
} }
if (!(real_parameters[1] is IDefaultOperatorNode)) if (!(real_parameters[1] is IDefaultOperatorNode))
{ {
is_dot_expr = true; is_dot_expr = true;
real_parameters[1].visit(this); il.Emit(OpCodes.Ldloca, lb_right);
il.Emit(OpCodes.Call, mi_right); il.Emit(OpCodes.Call, mi_right);
} }
MethodInfo eq_mi = null; MethodInfo eq_mi = null;

10
TestSuite/nullable11.pas Normal file
View file

@ -0,0 +1,10 @@
var i: integer;
function f1: boolean?;
begin
Inc(i);
Result := false;
end;
begin
assert(f1 <> true);
assert(i = 1);
end.