bug fix #2158
This commit is contained in:
parent
3b7bf665ef
commit
aefc784d26
|
|
@ -9601,7 +9601,13 @@ namespace PascalABCCompiler.NETGenerator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PushObjectCommand(ifc);
|
PushObjectCommand(ifc);
|
||||||
il.Emit(OpCodes.Ldftn, mi);
|
if (mi.IsVirtual || mi.IsAbstract)
|
||||||
|
{
|
||||||
|
il.Emit(OpCodes.Dup);
|
||||||
|
il.Emit(OpCodes.Ldvirtftn, mi);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
il.Emit(OpCodes.Ldftn, mi);
|
||||||
il.Emit(OpCodes.Newobj, cnstr);
|
il.Emit(OpCodes.Newobj, cnstr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -9614,8 +9620,6 @@ namespace PascalABCCompiler.NETGenerator
|
||||||
}
|
}
|
||||||
|
|
||||||
is_dot_expr = false;
|
is_dot_expr = false;
|
||||||
bool need_fee = false;
|
|
||||||
bool is_comp_gen = false;
|
|
||||||
EmitArguments(parameters, real_parameters);
|
EmitArguments(parameters, real_parameters);
|
||||||
if (value.new_obj_awaited())
|
if (value.new_obj_awaited())
|
||||||
{
|
{
|
||||||
|
|
@ -9689,7 +9693,13 @@ namespace PascalABCCompiler.NETGenerator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PushObjectCommand(ifc);
|
PushObjectCommand(ifc);
|
||||||
il.Emit(OpCodes.Ldftn, mi);
|
if (mi.IsVirtual || mi.IsAbstract)
|
||||||
|
{
|
||||||
|
il.Emit(OpCodes.Dup);
|
||||||
|
il.Emit(OpCodes.Ldvirtftn, mi);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
il.Emit(OpCodes.Ldftn, mi);
|
||||||
il.Emit(OpCodes.Newobj, value.constructor.constructor_info);
|
il.Emit(OpCodes.Newobj, value.constructor.constructor_info);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
40
TestSuite/delegates13.pas
Normal file
40
TestSuite/delegates13.pas
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
var i: integer;
|
||||||
|
|
||||||
|
type
|
||||||
|
t0 = abstract class
|
||||||
|
procedure p0; abstract;
|
||||||
|
procedure p2; virtual;
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
procedure p3;
|
||||||
|
begin
|
||||||
|
i := 3;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
t1 = class(t0)
|
||||||
|
procedure p0; override;
|
||||||
|
begin
|
||||||
|
i := 1;
|
||||||
|
end;
|
||||||
|
procedure p2; override;
|
||||||
|
begin
|
||||||
|
i := 2;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure p1(p: Action0);
|
||||||
|
begin
|
||||||
|
p();
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
var a := new t1 as t0;
|
||||||
|
p1(a.p0);
|
||||||
|
assert(i = 1);
|
||||||
|
p1(a.p2);
|
||||||
|
assert(i = 2);
|
||||||
|
p1(a.p3);
|
||||||
|
assert(i = 3);
|
||||||
|
end.
|
||||||
Loading…
Reference in a new issue