1
Vote

Setting values in .NET mutable structs sometimes fails for no apparent reason

description

This issue is best illustrated by example:
 
I have the following C# code compiled into a dll
 
namespace Sample
{
    public struct MutableStruct
    {
        public uint ui1;
        public long l2;
        public int i3;
        public ulong ul4;
    }
}
 
And then invoking it from IronRuby
 
require 'sample.dll'
 
100.times do |i|
  s = Sample::MutableStruct.new
  s.ui1 = 20

  if s.ui1 != 20
    puts "FAILED AT ITERATION #{i}"
    puts "<MutableStruct ui1=#{s.ui1} l2=#{s.l2} ui3=#{s.i3} ul4=#{s.ul4}>"
  end
end
 
And here is the output from running this small sample program multiple times:
 
C:\Dev\sample> ir .\tmp.rb
FAILED AT ITERATION 34
<MutableStruct ui1=0 l2=0 ui3=0 ul4=0>
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
FAILED AT ITERATION 34
<MutableStruct ui1=0 l2=0 ui3=0 ul4=0>
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
FAILED AT ITERATION 34
<MutableStruct ui1=0 l2=0 ui3=0 ul4=0>
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
FAILED AT ITERATION 34
<MutableStruct ui1=0 l2=0 ui3=0 ul4=0>
C:\Dev\sample> ir .\tmp.rb
FAILED AT ITERATION 93
<MutableStruct ui1=0 l2=0 ui3=0 ul4=0>
C:\Dev\sample> ir .\tmp.rb
FAILED AT ITERATION 34
<MutableStruct ui1=0 l2=0 ui3=0 ul4=0>
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
FAILED AT ITERATION 34
<MutableStruct ui1=0 l2=0 ui3=0 ul4=0>
C:\Dev\sample> ir .\tmp.rb
 
As you can see, IronRuby will mostly succeed, but sometimes, seemingly at random, it will simply not assign values to this mutable struct.

comments