Some strange IL generation error related to a doSomething() procedure. IlVerify shows stackUnderflow error
namespace ConsoleApplication5;
uses
System.Threading.Tasks;
type
EmptyClass = class
end;
Class1 = public class
private
procedure doSomething( var o);
begin
o := nil;
end ;
procedure doSomething2( var o : EmptyClass);
begin
o := nil;
end ;
public
method TestA() : Boolean;
begin
var obj := new EmptyClass() ;
doSomething( var obj ) ;
Console.WriteLine("TestA");
exit true;
end ;
method TestB(): Task<Boolean>;
begin
Result := await Task.Run(->
begin
var obj := new EmptyClass() ;
// doSomething( var obj ) ; //must be commented out!
await Task.Delay(1);
Console.WriteLine(“TestB”);
exit true;
end);
end;
method TestC() : Task<Boolean>;
begin
Result := await Task.Run(->
begin
var obj := new EmptyClass() ;
doSomething2( var obj ) ; //this works
await Task.Delay(1);
Console.WriteLine("TestC");
exit true ;
end);
end ;
method TestD() : Task<Boolean>;
begin
Result := await Task.Run(->
begin
var obj := new EmptyClass() ;
doSomething( var obj ) ; // this causes IL (stackUnderflow)
await Task.Delay(1);
Console.WriteLine("TestD");
exit true ;
end);
end ;
end;
Program = class
public
class method test : Task;
begin
var cl := new Class1() ;
cl.TestA;
await cl.TestB ;
await cl.TestC ;
await cl.TestD ;
end;
class method Main(args: array of String): Int32;
begin
// add your own code here
writeLn("The magic happens here.");
test;
while(true) do;
end;
end;
end.
Thanx; reprouced, and n arrowed it down quite a bit, this suffices.
namespace ConsoleApplication5;
uses
System.Threading.Tasks;
type
EmptyClass = class
end;
Class1 = public class
private
procedure doSomething( var o);
begin
o := nil;
end ;
public
method TestD() : Task<Boolean>;
begin
//Result := await Task.Run( -> begin
var obj := new EmptyClass() ;
doSomething( var obj ) ; // this causes IL (stackUnderflow)
await Task.Delay(1);
exit true ; // also IE if i kleep the "await Task.Run( -> begin" anfd remove this line
//Internal error: System.Exception: Exception of type 'System.Exception' was thrown.
//at RemObjects.Elements.Code.Compiler.CodeSimplifier.AllocateLocalVar (RemObjects.Elements.Code.BaseType aType, RemObjects.Elements.Code.VarDefinition aOrg, System.Boolean aPinned, System.Boolean aUnique, System.String aName) [0x00004] in <7055b29548ba41f3ba27fb690363ccd7>:0
//at RemObjects.Elements.Code.Compiler.CodeSimplifier.VisitBeginStatement (RemObjects.Elements.Code.BeginStatement beginStatement) [0x001db] in <7055b29548ba41f3ba27fb690363ccd7>:0
//at RemObjects.Elements.Code.BaseVisitor.VisitStatement (RemObjects.Elements.Code.Statement element) [0x001de] in <7df09fcb122f4e7ca47224ceb31b11c8>:0
//at RemObjects.Elements.Code.Compiler.CodeSimplifier.VisitStatement (RemObjects.Elements.Code.Statement element) [0x0001e] in <7055b29548ba41f3ba27fb690363ccd7>:0
//at RemObjects.Elements.Code.Compiler.CodeSimplifier.VisitBeginStatement (RemObjects.Elements.Code.BeginStatement beginStatement) [0x002f…
//end);
end;
end;
Program = class
public
class method Main(args: array of String): Int32;
begin
// add your own code here
writeLn("The magic happens here.");
var cl := new Class1();
cl.TestD;
end;
end;
end.