[Ironruby-core] Mysteriously broken calls to dispose?

Curt Hagenlocher curth at microsoft.com
Tue Sep 9 08:00:12 EDT 2008


Well, the interface itself only contains the parameterless method.  The version with the parameter is part of a very common pattern that also optimizes the finalization experience and plays nicely with derived classes.  If you're really concerned about cleaning something up, you'll probably follow that pattern.  But if you're just interested in the syntactic sugar of "using" and/or never expect the object's lifespan to exceed that of the current method, then there's no real need to implement the additional two methods or pay the cost of having a finalizer.  (Even if you suppress it later, creating an object with a finalizer is more expensive than creating it without one iirc.)

IDisposable is one of my favorite topics.  I believe that officially makes me a masochist.

From: ironruby-core-bounces at rubyforge.org [mailto:ironruby-core-bounces at rubyforge.org] On Behalf Of Ivan Porto Carrero
Sent: Tuesday, September 09, 2008 4:34 AM
To: ironruby-core at rubyforge.org
Subject: Re: [Ironruby-core] Mysteriously broken calls to dispose?

yep that is correct :)

http://github.com/casualjim/ironnails/tree/master/IronNails/vendor/iron_nails/lib/core_ext/kernel.rb

I figure you can wrap that in a begin..rescue block again and first try the one with the bool and then the one without it.
Some implementations of Dispose don't actually implement the method with a bool as parameter.

Instead of FileStream you can use the ruby File class or you could write a FileStreamAdapter in C# or something so you can safely use it from IronRuby without the overloading mayhem.

Cheers
Ivan

On Tue, Sep 9, 2008 at 1:25 PM, Curt Hagenlocher <curth at microsoft.com<mailto:curth at microsoft.com>> wrote:

Yes, this has been reported before (in fact, I think it was when someone was writing "using" ☺) and we haven't yet worked out a resolution.  I'll see if there's something quick that can be fixed here later today.



From: ironruby-core-bounces at rubyforge.org<mailto:ironruby-core-bounces at rubyforge.org> [mailto:ironruby-core-bounces at rubyforge.org<mailto:ironruby-core-bounces at rubyforge.org>] On Behalf Of Orion Edwards
Sent: Monday, September 08, 2008 10:12 PM
To: ironruby-core at rubyforge.org<mailto:ironruby-core at rubyforge.org>
Subject: Re: [Ironruby-core] Mysteriously broken calls to dispose?



Follow-up

If I call $fs.dispose(true), then it works.

It seems there's a protected dispose(bool) in a derived class.
I can't actually call Dispose(true) from C# as the compiler tells me it's protected.

It strikes me as somewhat broken that the method which ironruby actually invokes is the one that you shouldn't invoke...

At any rate, I'd be overjoyed if anyone could point me in the direction of a fix. I'm trying to write 'using' (a la C#) in ruby as part of demo for my local .NET user group. It should be trivial and showcase how awesome IronRuby is :-(

Orion Edwards wrote:

I don't seem to be able to call Dispose on a filestream. Needless to say this is problematic.

Here's a paste, straight from the IR console (latest svn version 141)

>>> require 'mscorlib'

=> true

>>> include System::IO

=> Object

>>> $fs = FileStream.new( 'file.txt', FileMode.Open )

=> #<System::IO::FileStream:0x000005c>

>>> $fs.Dispose

c:\development\ironruby\trunk\src\microsoft.scripting.core\actions\matchcaller.generated.cs:30:in `Call2': wrong number or type of arguments for `Dispose' (ArgumentError)

        from c:\development\ironruby\trunk\src\microsoft.scripting.core\actions\callsite.cs:275:in `UpdateAndExecute'

        from c:\development\ironruby\trunk\src\microsoft.scripting.core\actions\updatedelegates.generated.cs:38:in `Update2'

        from :0

>>>





All the other methods on the filestream object work fine (read_all_text, and so on), but the call to dispose crashes.

Likewise, I get a crash calling methods with overloads, which looks like it may (??) be related.

>>> require 'mscorlib'

=> true

>>> include System::IO

=> Object

>>> $bytes = System::IO::File.read_all_bytes( 'file.txt' ); nil  # nil is to prevent ir from printing the GIANT ARRAY

=> nil

>>> $text = System::Text::Encoding.UTF8.get_string($bytes)

c:\development\ironruby\trunk\src\microsoft.scripting.core\actions\matchcaller.generated.cs:35:in `Call3': wrong number or type of arguments for `get_string' (ArgumentError)

        from c:\development\ironruby\trunk\src\microsoft.scripting.core\actions\callsite.cs:275:in `UpdateAndExecute'

        from c:\development\ironruby\trunk\src\microsoft.scripting.core\actions\updatedelegates.generated.cs:45:in `Update3'

        from :0



>>> $text = System::Text::Encoding.UTF8.get_string($bytes, 0, $bytes.length)

=> "PROPER TEXT GOES HERE"



It seems like it can't figure out that there is GetString(bytes) and GetString(bytes, index, length) and just uses the latter always.
Is there a solution for either of these problems?

Thanks a lot, Orion








________________________________










_______________________________________________

Ironruby-core mailing list

Ironruby-core at rubyforge.org<mailto:Ironruby-core at rubyforge.org>



http://rubyforge.org/mailman/listinfo/ironruby-core



_______________________________________________
Ironruby-core mailing list
Ironruby-core at rubyforge.org<mailto:Ironruby-core at rubyforge.org>
http://rubyforge.org/mailman/listinfo/ironruby-core

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/ironruby-core/attachments/20080909/32f53b98/attachment-0001.html>


More information about the Ironruby-core mailing list